Google 数据存储部分字符串匹配

Google Datastore partial string matching

我读到有搜索 API。但是 Node.JS 似乎不存在 API。 如何在不知道属性全名的情况下部分匹配用于查询实体的字符串? 例如,我想 select 所有以 G 开头的用户。我怎样才能做到这一点? 感谢您的帮助!

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

而且搜索 API 实际上在灵活环境(包括 Node.JS)中不可用。 Search section in Migrating Services from the Standard Environment to the Flexible Environment:

表示了一个潜在的替代方案

The Search service is currently unavailable outside of the standard environment. You can host any full-text search database such as ElasticSearch on Google Compute Engine and access it from both the standard and flexible environments.

更新:

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

虽然您无法使用 Datastore 执行 "true" 部分字符串匹配(即包含),但您可以执行 "begins with" 查询,如 this post 中所述:

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

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

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

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

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

您也可以像这样模仿单词搜索 -

假设您有一个名为 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 字节(索引属性的限制),此方法将不起作用

同样,建议的解决方案并不能替代全文搜索引擎,而是您可以单独使用 Datastore 完成的一些技巧,并且可以满足简单的要求。