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”开头的所有实体。您可以使用相同的技术来匹配多个字符(例如>= 'JA' and < 'JA\ufffd'
)。
请注意,数据存储区中的字符串值/索引区分大小写,因此您需要一个索引属性,其中所有字符都为小写或大写,以便您可以相应地执行搜索。
你也可以像这样模仿单词搜索 -
假设您有一个名为 name
的属性,它存储以下值:
John Doe
John Smith
James Mike Murphy
要进行单词搜索(查找带有单词smith
或james 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 Cloud Datastore 过滤包含列表中项目的数据
库 appengine.api.datastore 和 com.google.cloud.datastore 有啥区别?
App Engine 上 Cloud Datastore 的客户端库 - NDB 或 google-cloud-datastore
Google Cloud Datastore Emulator 如何验证我们的 datastore-index.xml?