2013-07-17 4 views
6

複数の単語を持つ簡単なオートコンプリートユースケースを解くために弾性検索を使用するにはどうすればよいですか?elasticsearch接頭辞複数の単語を使用してオートコンプリートのユースケースを解決する

私は以下のタイトルの文書を持っていると言います。弾性検索は、ルーゼンの上に構築された素晴らしい検索ツールです。

だから私は接頭クエリを使用して、フォームでそれを構築する場合 -

{ 
    "prefix" : { "title" : "Elas" } 
} 

をそれは、結果セットでそのドキュメントを返します。私は

{ 
    "prefix" : { "title" : "Elastic sea" } 
} 

のプレフィックス検索を行う場合

は、しかし、私は結果を得ることはありません。

シンプルなオートコンプリートユースケースの結果をユーザに提示するために、どのようなクエリを構成する必要がありますか?

答えて

2

この結果を得るには、ブール検索を使用する必要があります。部分的な単語はプレフィックスクエリである必要があり、完全な単語またはフレーズは一致句に含まれる必要があります。必要に応じて適用する必要がありますなど、クエリに利用可能な他の調整があります。 Elastic seaで行わ

{ 
    "query": { 
     "bool": { 
      "must": [ 
       { 
        "prefix": { 
         "name": "sea" 
        } 
       }, 
       { 
        "match": { 
         "name": "elastic" 
        } 
       } 
      ] 
     } 
    } 
} 
9

プレフィックスクエリはインデックスにElastic searchのような用語に一致しますが、あなたは空白にトークン化ならば、それはあなたのインデックスには表示されません。あなたが持っているものは、2つの異なるトークンとしてelasticsearchです。 analyze apiを見て、実際にテキストをどのように索引付けしているかを調べてください。

回答のようなブール型クエリを使用すると、用語の位置は考慮されません。その結果、たとえば次のような文書が得られます。

弾性モデルはムーセスオブジェクトを格納し、 を検索するためのフレームワークです。

自動補完の目的で、フレーズクエリを作成し、最後の語句を接頭辞として使用することができます。あなたの例の文書が一致します。このクエリでは

{ 
    "match" : { 
     "message" : { 
      "query" : "elastic sea", 
      "type" : "phrase_prefix" 
     } 
    } 
} 

が、鉱山はelasticsearchに近接していないではないであろうから:それはまさにあなたのユースケースのために利用できるようになりましたmatch queryにmatch_phrase_prefixタイプを使用して、ボックスのうち利用可能ですそこ。

+0

私は明らかにしておかなければなりません。これは私の間違いです。私はタイトルだけを見ているので、用語の位置は私にとっては重要ではありません。私があなたの例でElastic Moosを検索した場合、phrase_prefixクエリは結果を戻しませんか? – user1796571

+0

いいえ、それはしません!私が提案したクエリは、用語の位置を考慮に入れ、プレフィックスとして扱う最後のものだけを展開します。 – javanna

関連する問題