我已经读过有Search API。但似乎Node.JS不存在此API。 如何在不知道属性全名的情况下部分匹配查询实体的字符串? 例如,我想选择以G开头的所有用户。我该如何做到这一点? 谢谢你的帮助!
答案 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
要进行单词搜索(查找带有单词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查询不受支持,除非您使用的客户端库支持它(通常通过运行多个查询来完成)。
如果您的属性具有超过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目前也可在标准环境中使用,请参阅: