2017-02-04 5 views
1

私はElasticsearch 5.2を使用しています。私は1つの文書のみがあるインデックスに対して以下のクエリを実行していElasticsearch wrong explanation validity api

問合せ:

GET test/val/_validate/query?pretty&explain=true 
{ 
    "query": { 
    "bool": { 
     "should": { 
     "multi_match": { 
      "query": "alkis stackoverflow", 
      "fields": [ 
      "name", 
      "job" 
      ], 
      "type": "most_fields", 
      "operator": "AND" 
     } 
     } 
    } 
    } 
} 

ドキュメント:

PUT test/val/1 
{ 
    "name": "alkis stackoverflow", 
    "job": "developer" 
} 

クエリの説明がある

+(((+job:alkis +job:stackoverflow) (+name:alkis +name:stackoverflow))) #(#_type:val) 

私はこれを読んで:フィールドジョブはalkisstackoverflow と フィールド名がalkisstackoverflow

を持っている必要があります。これは、しかし、私の文書の場合ではありません持っている必要があります 。私はbest_fieldsにタイプを変更すると2つのフィールド間AND(それは私が取得していた結果から思えるように)実際にORある

は、私が正しい説明はどれ

+(((+job:alkis +job:stackoverflow) | (+name:alkis +name:stackoverflow))) #(#_type:val) 

を取得します。

validate apiにバグはありますか?私は何かを誤解したことがありますか?得点がこれらの2つのタイプの唯一の違いではないのですか?

答えて

1

明示的なANDオペレータとmost_fieldsタイプを選んだので、the reasoningは1つの試合のクエリはフィールドごとに生成されることになるだろうとすべての条件があると一致する文書のための単一のフィールドに存在しなければならないことは、あなたのつまり、alkisstackoverflowの両方の語句がnameフィールドに存在するため、その文書が一致するのはなぜですか。対応するLuceneクエリの説明でそう

、すなわち

+(((+job:alkis +job:stackoverflow) (+name:alkis +name:stackoverflow))) 

は特定の事業者が単語と単語の間に指定されていないとき、default one is an OR

だから、あなたはこれを読む必要があります。フィールドjobが持っている必要がありますalkisstackoverflowまたはフィールドnameの両方がalkisstackoverflowの両方である必要があります。

適用するAND演算子は、クエリ内のすべての用語に関係しますが、単一のフィールドに関しては、すべてのフィールド間でANDではありません。同じを含む複数のフィールドをクエリする際most_fieldsタイプが最も有用である、要するに

{ 
    "query": { 
    "bool": { 
     "should": [ 
     { "match": { "job": "alkis stackoverflow" }}, 
     { "match": { "name": "alkis stackoverflow" }} 
     ] 
    } 
    } 
} 

:あなたのクエリは、このように、bool/should句で2つのmatchクエリ(フィールドにつき1)として実行されますが、別の言い方をするとテキストはさまざまな方法で分析されます。これはあなたのケースではありませんあなたのユースケースに応じてcross_fieldsまたはbest_fieldsを使用するのが良いでしょうが、確かにmost_fieldsではありません。

UPDATEは

best_fieldsタイプを使用して、ESは、符号(OR !!されていない)は、dis_maxクエリ内のすべてのサブクエリを分離する代わりbool/shoulddis_max query|とを生成します。

+0

ありがとうございました。デフォルトの演算子が 'OR'の場合、なぜ' best_fields'を使うときに '|'が表示されますか? – alkis

+1

'best_fields'型を使用すると、ESは[dis_max'クエリ](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-dis-max-query)を生成します。 html)ではなく、 '|'(OR !!ではない)の記号は 'dis_max'クエリですべてのサブクエリを区切ります。 – Val

+0

私はいくつかの読書をしているようです。ご協力ありがとうございました。このコメントをあなたの答えに加えてください。これが私の質問を解決したものです。 – alkis