Google Datastore 部分字符串匹配

Posted

技术标签:

【中文标题】Google Datastore 部分字符串匹配【英文标题】:Google Datastore partial string matching 【发布时间】:2017-05-22 08:45:49 【问题描述】:

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

【问题讨论】:

【参考方案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 目前也可以在标准环境中使用,请参阅:

Now, you can deploy your Node.js app to App Engine standard environment Google App Engine Node.js Standard Environment Documentation

【讨论】:

对不起,如果我没有表达清楚。我知道物业名称,但感谢您的回复。我想在计算/容器引擎中托管我的 node.js 代码,这是个问题吗? 这是因为计算/容器引擎在标准GAE环境之外,因此您不能使用Search API。【参考方案2】:

虽然您无法对 Datastore 进行“真正的”部分字符串匹配(即包含),但您可以按照 this post 中的说明进行“开头为”查询:

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

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

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

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

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

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

假设您有一个名为 name 的属性,它存储以下值:

John Doe
John Smith 
James Mike Murphy

要进行单词搜索(查找带有单词smithjames and murphy 的实体)- 创建另一个属性(例如nameIndex)并将name 中的单词存储为数组属性(注意所有单词都转换为低案子)。

["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 并满足简单要求的一些技巧。

【讨论】:

帖子链接为空? @JumpLink - 不确定该链接发生了什么,但此答案包含所需的所有相关信息。 这是工作链接 - ***.com/questions/47786/…。另外,我尝试了 unicode 方法,但对我不起作用。也许它现在被禁用了。但对我有用的是 - SELECT * FROM USER WHERE USERNAME >= 'G' AND USERNAME

以上是关于Google Datastore 部分字符串匹配的主要内容,如果未能解决你的问题,请参考以下文章

Google Datastore 中的原子序列计数器

Google Cloud Datastore 过滤包含列表中项目的数据

库 appengine.api.datastore 和 com.google.cloud.datastore 有啥区别?

App Engine 上 Cloud Datastore 的客户端库 - NDB 或 google-cloud-datastore

Google Cloud Datastore Emulator 如何验证我们的 datastore-index.xml?

r memoise google datastore示例