6

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

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

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

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

带有参数“最佳”的 ndb 查询将匹配acct.

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

更新:我也在看gql. 这样做:

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

返回一个Parse Error: Invalid WHERE Condition at symbol LIKE

4

3 回答 3

11

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

NDB 的 String 字段以您可以进行大于 ( >=) 和小于 ( <) 搜索的方式进行索引。假设以下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 个结果的人。由于限制,喜欢kross和的名称lark将被过滤掉。

注意:重要的是您必须ndb.ComputedProperty包含要搜索的字段的小写版本。不要忘记添加它!

于 2016-02-05T03:10:31.910 回答
7

GQL 没有通配符匹配,要实现这一点,您需要使用全文搜索

于 2013-01-12T09:25:59.347 回答
3

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

于 2013-01-12T12:59:00.067 回答