Google Datastore部分字符串匹配

时间:2017-01-07 18:47:36

标签: node.js google-app-engine google-cloud-datastore google-search-api

我已经读过有Search API。但似乎Node.JS不存在此API。 如何在不知道属性全名的情况下部分匹配查询实体的字符串? 例如,我想选择以G开头的所有用户。我该如何做到这一点? 谢谢你的帮助!

2 个答案:

答案 0 :(得分:8)

虽然您无法对数据存储执行“真正的”部分字符串匹配(即包含),但您可以按照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

要进行单词搜索(查找带有单词smithjames 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查询不受支持,除非您使用的客户端库支持它(通常通过运行多个查询来完成)。

如果您的属性具有超过1500个字节的数据(索引属性的限制)

,则此方法将不起作用

同样,所提出的解决方案并不是全文搜索引擎的替代品,而是单独使用数据存储区可以完成的几个技巧,可以满足简单的要求。

答案 1 :(得分:1)

您无法对数据存储区实体执行部分匹配搜索(更不用说不知道属性/属性的名称)。见Appengine Search API vs Datastore

事实上,搜索API在灵活环境(包括Node.JS)中不可用。可能的替代方案是Search section in Migrating Services from the Standard Environment to the Flexible Environment

  

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

更新:

Node.JS目前也可在标准环境中使用,请参阅: