【问题标题】:Search a string beginning with a prefix in Google App Engine Datastore在 Google App Engine Datastore 中搜索以前缀开头的字符串
【发布时间】:2016-09-01 19:48:15
【问题描述】:

我想搜索名称以特定字符串开头的所有实体,这在 Datastore 中是否可行?

我试过了:

q = datastore.NewQuery("Places").Filter("Name > ", "a")

但它不起作用。

如果这不可能,您可以向我建议什么替代解决方案?大查询? App Engine 上的 BigTable 或其他服务?

【问题讨论】:

  • 删除尾随空格:"Name > " 并重试。
  • 尾随空格?和你一样吗?
  • 将其更改为:"Name >"。另外,你怎么知道它不起作用? >a 表示除 a 以外的所有字母。这就是你得到的吗?

标签: string google-app-engine go google-cloud-datastore gql


【解决方案1】:

这是可能的,但需要结合 2 个不等式过滤器。

假设您要列出具有 "li" 前缀的 Places。这可以用一个查询来描述,该查询列出了大于(或等于)"li" 并且 小于一个前缀的 Places,该前缀是按字典顺序排列的 "li" 之后的下一个字符串:@ 987654327@.

这是 GQL 的样子:

SELECT * FROM Places WHERE Name > 'li' AND Name < 'lj'

Go 中的代码如下所示:

q = datastore.NewQuery("Places").Filter("Name >", "li").Filter("Name <", "lj")

这将列出Places,其中名称例如:

liam
lisotto
lizst

但会排除以下名称:

abc
ljoi
lj
qwerty

需要注意的一点:大小写字母的字典顺序不同,例如"List" 小于"li"(即使"list" 大于"li")!

【讨论】:

  • @Fantasim 如果答案有效并解决了您的问题,您应该接受它。你有很多问题,但你没有接受一个答案。答案的投票下方有一个灰色的“勾号”,您可以通过单击它来接受它。将鼠标悬停在上面会显示一个文本:"点击接受这个答案..."
  • 您能否准确回答为什么此解决方案不适用于订单过滤器?
  • @Fantasim “订单过滤器”是指简单的.Filter("Name &gt;", "li")?因为这个单一的过滤器也将接受 "ljoi",例如,它没有 "li" 前缀。第二个过滤器.Filter("Name &lt;", "lj") 需要排除前缀为“超越”"li" 的所有内容。
  • q = datastore.NewQuery("Places").Filter("Name >", "sorb").Filter("Name
  • @Fantasim 很可能是因为您没有适当的索引。每个搜索/过滤器都对索引进行操作。按Name 过滤需要对Name 属性进行索引。如果您还希望结果按PostNb 排序,则需要一个包含两者的索引。另外:"...如果查询指定属性的不等式过滤器和其他属性的排序顺序,则不等式过滤器中使用的属性必须在其他属性之前排序。" (source)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 2017-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多