ndb查询部分字符串匹配

时间:2013-01-12 09:04:27

标签: google-app-engine app-engine-ndb djangoappengine

这似乎应该是一个简单的问题。但是the docs似乎没有回答它。使用他们的例子,我想这样做:

Account.query(Account.title == "best")

除了我想要匹配部分字符串。所以在这种情况下:

acct = Account(title="the best account in the world")

带参数“best”的ndb查询将匹配acct

我目前唯一看到的选项是遍历Account.query()并将每个titlere.search模块匹配在python中。这似乎不是一个好的解决方案。

更新:我也在关注gql。这样做:

acct = ndb.gql('SELECT * from Account WHERE title LIKE '%best%')

返回Parse Error: Invalid WHERE Condition at symbol LIKE

3 个答案:

答案 0 :(得分:7)

GQL没有通配符匹配,要实现这一点,您需要使用full text search

答案 1 :(得分:7)

注意:这并不能完全回答这个问题,但是有人在寻找starts with可能会觉得这个答案很有用。

NDB的字符串字段的索引方式是您可以执行大于(>=)和小于(<)的搜索。假设以下Person模型:

class Person(ndb.Model):
    name         = ndb.StringProperty()
    name_lower   = ndb.ComputedProperty(lambda self: self.name.lower())

您可以执行以下操作:

def search_by_text(text):
  text = text.lower()
  limit = text[:-1] + chr(ord(text[-1]) + 1)
  return Person.query(Person.name_lower >= text, Person.name_lower < limit).fetch(50)

p = search_by_text('kri')

此示例中的limit变量将包含字符串'krj',并成为搜索值的限制。以上内容将为您提供名称大于kri但小于krj的所有人,并限制前50个发现。由于此限制,{i} krosslark等名称将被过滤掉。

注意:您必须ndb.ComputedProperty包含要搜索的字段的小写版本。别忘了添加!

答案 2 :(得分:3)

对于像标题这样的(推测)短字段,添加包含标题的每个单词的重复StringProperty(可能忽略停用词)将允许您匹配单词,并且比使用搜索API更简单。