2013-08-23 3 views
8

elasticsearch APIを介してquery string queryが実際にどのように解析されているかを調べる方法はありますか? lucene query syntaxを見ることで手動で行うことができますが、パーサが実際に行っている結果を表示することができれば本当にうれしいでしょう。elasticsearchの結果を調べるにはどうすればquery_stringを解析できますか?

+1

Explain出力を有効にしようとしましたか?検索要求にexplain = trueを追加しましたか? – javanna

+1

@javanna explain = trueの目的は個々の結果の評価を説明することだけであり、何が起こっているのかを少し推測するのに役立ちます。しかし、私は何か明示的に、特に複雑な場合には、それを好むでしょう。 –

+1

さて、[validate query api](http://www.elasticsearch.org/guide/reference/api/validate/)を見て、ここで説明を使用すると、より良くなるはずです。 – javanna

答えて

5

javannaがコメントで述べたように、_validate apiがあります。ここに私の地元の弾性(バージョン1.6)にどのような作品です:

curl -XGET 'http://localhost:9201/pl/_validate/query?explain&pretty' -d' 
{ 
    "query": { 
     "query_string": { 
     "query": "a OR (b AND c) OR (d AND NOT(e or f))", 
     "default_field": "t" 
    } 
    } 
} 
' 

plは私のクラスタ上のインデックスの名前です。異なるインデックスにはアナライザが異なる可能性があります。そのため、クエリの検証はインデックスのスコープ内で実行されます。

上記カールの結果は以下の通りです:

{ 
    "valid" : true, 
    "_shards" : { 
    "total" : 1, 
    "successful" : 1, 
    "failed" : 0 
    }, 
    "explanations" : [ { 
    "index" : "pl", 
    "valid" : true, 
    "explanation" : "filtered(t:a (+t:b +t:c) (+t:d -(t:e t:or t:f)))->cache([email protected]f1)" 
    } ] 
} 

私はわざと1つのOR小文字を作って、あなたが説明に見ることができるように、それはトークンとしてではなく演算子として解釈されます。

説明の解釈について。フォーマットはquery stringクエリの+-operatorsのようになります。

  • (と)の文字が起動し、bool query
  • +を終了プレフィックスはmust
  • になります句を意味します - プレフィックスはmust_not
  • になります句を意味し、
  • 接頭辞は、それがshouldにあることを意味する(default_operatorORに等しい)

したがって、上記の次と同等になります。

{ 
    "bool" : { 
    "should" : [ 
     { 
     "term" : { "t" : "a" } 
     }, 
     { 
     "bool": { 
      "must": [ 
      { 
       "term" : { "t" : "b" } 
      }, 
      { 
       "term" : { "t" : "c" } 
      } 
      ] 
     } 
     }, 
     { 
     "bool": { 
      "must": { 
       "term" : { "t" : "d" } 
      }, 
      "must_not": { 
      "bool": { 
       "should": [ 
       { 
        "term" : { "t" : "e" } 
       }, 
       { 
        "term" : { "t" : "or" } 
       }, 
       { 
        "term" : { "t" : "f" } 
       } 
       ] 
      } 
      } 
     } 
     } 
    ] 
    } 
} 

私は多くの条件での複雑なfilteredクエリをデバッグするのは非常に重く_validate APIを使用していました。これは、URLのようなアナライザのトークン化された入力がどのようにキャッシュされているかをチェックしたい場合に特に便利です。

これまで私が気づいていなかった素晴らしいパラメータrewriteもあります。これにより、実行される実際のLuceneクエリの説明がさらに詳細になります。

関連する問題