部分匹配GAEsearchAPI
使用GAEsearchAPI可以search部分匹配吗?
我试图创build自动完成function,其中的术语将是一个部分词。 例如。
> b
> bui
>build立
都会返回“build筑”。
GAE怎么可能?
虽然LIKE语句(部分匹配)在全文search中不受支持,但您可以绕过它。
首先,为所有可能的子string(hello = h,he,hel,lo等)标记数据string。
def tokenize_autocomplete(phrase): a = [] for word in phrase.split(): j = 1 while True: for i in range(len(word) - j + 1): a.append(word[i:i + j]) if j == len(word): break j += 1 return a
使用标记化的string构build索引+文档(Search API)
index = search.Index(name='item_autocomplete') for item in items: # item = ndb.model name = ','.join(tokenize_autocomplete(item.name)) document = search.Document( doc_id=item.key.urlsafe(), fields=[search.TextField(name='name', value=name)]) index.put(document)
执行search,然后哇!
results = search.Index(name="item_autocomplete").search("name:elo")
https://code.luasoftware.com/tutorials/google-app-engine/partial-search-on-gae-with-search-api/
正如全文search和LIKE语句所描述的,不可能,因为searchAPI实现了全文索引。
希望这可以帮助!
就像@Desmond Lua的回答,但是具有不同的标记化function:
def tokenize(单词): 令牌= [] words = word.split('') 换言之: 我在范围内(len(word)): 如果我== 0:继续 w = word [i] 如果我== 1: 令牌+ = [字[0] + W] 继续 令牌+ = [令牌[-1:] [0] + W] 返回“,”join(令牌)
它会parsinghello world
, he,hel,hell,hello,wo,wor,worl,world
。
这对于轻量级的自动完成目的是很好的
我有typeahead控件相同的问题,我的解决scheme是parsingstring的小部分:
name='hello world' name_search = ' '.join([name[:i] for i in xrange(2, len(name)+1)]) print name_search; # -> he hel hell hello hello hello w hello wo hello wor hello worl hello world
希望这个帮助
我的版本优化:不重复令牌
def tokenization(text): a = [] min = 3 words = text.split() for word in words: if len(word) > min: for i in range(min, len(word)): token = word[0:i] if token not in a: a.append(token) return a