1

我读过,有搜索API。但是好像这个API不存在Node.JS. 如何在不知道属性全名的情况下部分匹配查询实体的字符串? 例如,我想选择所有以G开头的用户。我该如何实现? 谢谢你的帮助!谷歌数据存储部分字符串匹配

回答

4

虽然不能做一个“真”的部分字符串匹配(即,包含)与数据存储区,可以执行一个查询“开头”,如this post描述:

基本上,创建像一个复合不等式滤波器这个:

SELECT * FROM USER WHERE USERNAME >= 'G' AND USERNAME < 'G\ufffd'. 

这里,\ufffd是最后一个有效的unicode字符。

这将返回所有实体的用户名以'G'开头。您可以使用相同的技术来匹配多个字符(例如>= 'JA' and < 'JA\ufffd')。

请注意,数据存储区中的字符串值/索引区分大小写,因此您需要索引属性以及所有字符(小写或大写),以便您可以相应地执行搜索。

你也可以模仿一个词搜索这样的 -

假设你有一个名为name属性存储以下值:

John Doe 
John Smith 
James Mike Murphy 

要做到一个字搜索(找到字smith实体或james and murphy) - 创建另一个属性(例如nameIndex)并将名称中的单词存储为数组属性(注意所有单词都转换为小写)。

["john","doe"] 
["john", "smith"] 
["james", "mike" "murphy"] 

现在你可以使用nameIndex财产做一个单词搜索 -

SELECT * FROM Entity WHERE nameIndex = 'smith' 
SELECT * FROM Entity WHERE nameIndex = 'james' AND nameIndex='murphy' 

再次,注意nameIndex需要存储在一个固定的情况下(下或上)的数据和您的查询参数应该使用这种情况。此外,除非您使用的客户端库支持OR查询(通常通过运行多个查询完成),否则OR查询不受支持。

这种做法是行不通的,如果你的财产已超过1500个字节的数据(上限为索引属性)

再次,提出的解决方案是不是更换为全文搜索引擎,而一些技巧你可以单独使用数据存储并可以满足简单的要求。

+0

帖子链接为空? – JumpLink

+0

@JumpLink - 不知道该链接发生了什么,但这个答案有所有需要的相关信息。 –

1

您不能在数据存储实体上执行部分匹配搜索(更不用说不知道属性/属性的名称)。请参阅Appengine Search API vs Datastore

而且,在灵活环境(包括Node.JS)中确实无法使用Search API。 Search section in Migrating Services from the Standard Environment to the Flexible Environment

搜索服务目前不在标准的 环境之外。您可以托管任何全文搜索数据库,如 ElasticSearch on Google Compute Engine,并可从 访问标准和灵活环境。

+0

对不起,如果我没有明确表达我的意见。我知道属性名称,但感谢您的回复。 我想要在compute/container引擎中托管我的node.js代码,那么这是一个问题吗? – ReasoN

+0

正如计算/容器引擎在标准GAE环境之外,因此您不能使用Search API。 –