部分匹配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 worldhe,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