GAE 検索 APIを使用して部分一致を検索することはできますか?
用語が部分的な単語になるオートコンプリート機能を作成しようとしています。例えば。
> b
> bui
> ビルド
すべて「建物」を返します。
これはGAEでどのように可能ですか?
GAE 検索 APIを使用して部分一致を検索することはできますか?
用語が部分的な単語になるオートコンプリート機能を作成しようとしています。例えば。
> b
> bui
> ビルド
すべて「建物」を返します。
これはGAEでどのように可能ですか?
LIKE ステートメント (部分一致) は全文検索ではサポートされていませんが、ハックすることはできます。
まず、可能なすべての部分文字列のデータ文字列をトークン化します (hello = h、he、hel、lo など)。
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
トークン化された文字列を使用してインデックス + ドキュメント (検索 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)
検索を実行して、ワラ!
results = search.Index(name="item_autocomplete").search("name:elo")
https://code.luasoftware.com/tutorials/google-app-engine/partial-search-on-gae-with-search-api/
@Desmond Luaの回答と同じですが、トークン化機能が異なります:
def tokenize(単語): トークン=[] words = word.split(' ') 一言一句: for i in range(len(word)): i==0 の場合: 続行 w = 単語[i] i==1 の場合: トークン+=[単語[0]+w] 継続する トークン+=[トークン[-1:][0]+w] return ",".join(トークン)
として解析hello world
されhe,hel,hell,hello,wo,wor,worl,world
ます。
軽いオートコンプリートの目的に適しています
先行入力制御についても同じ問題があり、私の解決策は文字列を解析して小さな部分にすることです:
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
この助けを願っています