这似乎应该是一个简单的问题。但是the docs似乎没有回答它。使用他们的例子,我想这样做:
Account.query(Account.title == "best")
除了我想要匹配部分字符串。所以在这种情况下:
acct = Account(title="the best account in the world")
带参数“best”的ndb查询将匹配acct
。
我目前唯一看到的选项是遍历Account.query()
并将每个title
与re.search
模块匹配在python中。这似乎不是一个好的解决方案。
更新:我也在关注gql
。这样做:
acct = ndb.gql('SELECT * from Account WHERE title LIKE '%best%')
返回Parse Error: Invalid WHERE Condition at symbol LIKE
答案 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} kross
和lark
等名称将被过滤掉。
注意:您必须ndb.ComputedProperty
包含要搜索的字段的小写版本。别忘了添加!
答案 2 :(得分:3)
对于像标题这样的(推测)短字段,添加包含标题的每个单词的重复StringProperty(可能忽略停用词)将允许您匹配单词,并且比使用搜索API更简单。