2013-01-12 177 views
5

这看起来应该是一个简单的问题。但the docs似乎没有回答。使用他们的例子,我想这样做:ndb查询部分字符串匹配

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

除我想匹配部分字符串以及。因此,在这种情况下:

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

的NDB查询与参数“最佳”将匹配acct

我目前看到的唯一选择是循环穿过Account.query(),并在python中将每个titlere.search模块进行匹配。这似乎不是一个好的解决方案。

更新:我还在看gql。这样做:

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

返回Parse Error: Invalid WHERE Condition at symbol LIKE

+0

GQL不是SQL。 –

回答

3

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

+1

这是常见的做法吗?看起来像一个黑客。 – mehulkar

+0

哇..真的很惊讶这个答案.. :-( – CIF

+0

我没有实现这个我自己,虽然我看到它推荐的其他地方(对不起,我没有链接)。 – Trevor

5

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

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个调查结果。由于限制,krosslark等名称将被滤除。

注意:重要的是您有一个ndb.ComputedProperty包含要搜索的字段的小写版本。不要忘记补充一点!

+0

这是最好的解决方案我可以找到一个简单的部分字符串匹配搜索,而无需执行全文搜索。 – werm098