2017-11-08 4 views
1

私は、Elasticsearchでmatch_phrase_prefixクエリを使用すると、特にクエリが1つの単語に続いて1つの文字。Elasticsearchの一致フレーズプレフィックスがすべての単語に一致しない

http://localhost:9200/test/drinks/_mapping 

リターン:

は、このインデックスマッピング(これは機密データを保護するために、不自然な例です)乗り

{ 
    "test": { 
    "mappings": { 
     "drinks": { 
     "properties": { 
      "name": { 
      "type": "text" 
      } 
     } 
     } 
    } 
    } 
} 

そして他のレコードの数百万人の中にこれらは以下のとおりです。

{ 
    "_index": "test", 
    "_type": "drinks", 
    "_id": "2", 
    "_score": 1, 
    "_source": { 
     "name": "Johnnie Walker Black Label" 
    } 
}, 
{ 
    "_index": "test", 
    "_type": "drinks", 
    "_id": "1", 
    "_score": 1, 
    "_source": { 
     "name": "Johnnie Walker Blue Label" 
    } 
} 

次のクエリは、1つの単語とそれに続く2文字の文字です:

POST http://localhost:9200/test/drinks/_search 
{ 
    "query": { 
     "match_phrase_prefix" : { 
      "name" : "Walker Bl" 
     } 
    } 
} 

戻り、この:

POST http://localhost:9200/test/drinks/_search 
{ 
    "query": { 
     "match_phrase_prefix" : { 
      "name" : "Walker B" 
     } 
    } 
} 

返さない結果:一つの単語と1つの文字で、このクエリ一方

{ 
    "took": 1, 
    "timed_out": false, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 2, 
     "max_score": 0.5753642, 
     "hits": [ 
      { 
       "_index": "test", 
       "_type": "drinks", 
       "_id": "2", 
       "_score": 0.5753642, 
       "_source": { 
        "name": "Johnnie Walker Black Label" 
       } 
      }, 
      { 
       "_index": "test", 
       "_type": "drinks", 
       "_id": "1", 
       "_score": 0.5753642, 
       "_source": { 
        "name": "Johnnie Walker Blue Label" 
       } 
      } 
     ] 
    } 
} 

。ここで何が起こっているのでしょうか?

答えて

1

あなたはElasticsearch 5.0以上で作業していると仮定します。 max_expansionsのデフォルト値が原因である可能性があります。

ドキュメントhereに示されているように、max_expansionsパラメータは、最後の用語が展開されるプレフィックスの数を制御するために使用されます。デフォルト値は50で、BとLの2つの最初の文字で「黒」と「青」を見つける理由が説明されています。

ドキュメントには、それについてかなり明確である:

match_phrase_prefixクエリは貧乏人のオートコンプリートです。これは非常に使いやすいですが、あなたは検索タイプのままですばやく始めることができますが、その結果は十分ですが、時には混乱することがあります。

クエリ文字列quick brown fを考えてみましょう。このクエリは、クイックとブラウンのフレーズクエリを作成することで機能します(つまり、クイック用語は存在し、ブラウンという用語が続く必要があります)。次に、ソートされた用語辞書を調べて、fで始まる最初の50語を見つけ、これらの用語をフレーズクエリに追加します。

問題は、最初の50語にはフォックスという用語が含まれていない可能性があるため、フェーズ・ブラウン・キツネが見つからないことです。これは通常、ユーザーが探している単語が出現するまで続きます。

このパラメータを50以上に増やしてもよいかどうかはわかりません私は自分自身を試みたことがないので、良いパフォーマンスを探しています。

+0

1つの質問では、「クイック」と「ブラウン」が検索されます。その後、elasticsearchは、 "f"で始まり、 "quick"と "brown"の順で先行する50語(デフォルト)を探しますか?あるいは、「f」で始まる用語だけですか?そして、前のケースのいずれにおいても、少なくとも(この質問では)「b」(「青」と「黒」)で始まる用語が2つあるなら、結果を返さないのですが、私は最初の50語少なくともその2つまたは他のものが示されるべきである。または私はすべて間違っています。 – Jose

+0

50語は、(ESがカスタム言語をサポートしているので)あなたのクラスタで使用されている言語に基づいた組み込み辞書からのもので、インデックスにある別のドキュメントのものではありません。これは、なぜそれがmatch_phrase_prefix querieのカスタムパラメータであり、単に "size"パラメータを使用するのとは異なるのかを説明します – Rlarroque

+0

私の場合、フィールドにはマッピングの言語プロパティはありません。そしてすぐに私は新しい手紙を紹介し、結果はより正確に表示されます。私は '' type ":" phrase_prefix "というマルチクエリクエリを使用していますので、' max_expansions'パラメータは使用できません。 – Jose

関連する問題