13

GAE 検索 APIを使用して部分一致を検索することはできますか?

用語が部分的な単語になるオートコンプリート機能を作成しようとしています。例えば。

> b
> bui
> ビルド

すべて「建物」を返します。

これはGAEでどのように可能ですか?

4

6 に答える 6

31

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/

于 2012-11-01T04:57:18.797 に答える
3

@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ます。

軽いオートコンプリートの目的に適しています

于 2016-07-19T07:35:00.120 に答える
0

先行入力制御についても同じ問題があり、私の解決策は文字列を解析して小さな部分にすることです:

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

この助けを願っています

于 2015-04-18T09:45:27.377 に答える