2016-05-10 16 views
2

弾性検索でクエリをネストするさまざまな方法を理解するのに少し問題があります。ここに私のインデックス付きデータが..だからboolと範囲クエリ、弾性検索の結合が難しい

{ 
    "Underlying" : "Eurodollar", 
    "Expiration" : "20160315" 
}, 
{ 
    "Underlying" : "Eurodollar", 
    "Expiration" : "20160415" 
}, 
{ 
    "Underlying" : "Eurodollar", 
    "Expiration" : "20160515" 
} 

どのように見えるかの例ですが、私はこの

{ 
    "query" : { 
     "range" : { 
      "Expiration" : { 
       "gte" : "20160315", 
       "lte" : "20160515" 
      } 
     } 
    } 
} 

期待通りのようなクエリを実行することができた、私はすべてのエントリを取得します。しかし、私もこのようなエントリを索引付けしているとします。

{ 
    "Underlying" : "Something else", 
    "Expiration" : "20160415" 
} 

私は「何か他のもの」の結果が戻ってくるしたくないので、私は今、このような何かをしようとします。

{ 
    "query" : { 
     "bool" : { 
      "must" : [ 
       { 
        "term" : { 
         "Underlying" : { 
          "value" : "eurodollar" 
         } 
        } 
       } 
      ] 
     }, 
     "range" : { 
      "Expiration" : { 
       "gte" : "20160315", 
       "lte" : "20160515" 
      } 
     } 
    } 
} 

しかし、私は、私ため、エラーの最も関連するテキストは、私は私のBOOL /用語のクエリが動作している知っているこの

Expected field name but got START_OBJECT "bool" 

であるように思わエラーに

RequestError(400, u'SearchPhaseExecutionException[Failed to execute phase [query], all shards failed; shardFailures {[cCrh939sR7yHdKgawRi6Sw][test-index][0]: SearchParseException[[test-index][0]: query[Expiration:[20160215 TO 20160415]],from[-1],size[-1]: Parse Failure [Failed to parse source [{"query": {"range": {"Expiration": {"gte": "20160215", "lte": "20160415"}}, "bool": {"must": [{"term": {"Underlying": {"value": "eurodollar"}}}]}}}]]]; nested: ElasticsearchParseException[Expected field name but got START_OBJECT "bool"]; }{[cCrh939sR7yHdKgawRi6Sw][test-index][1]: SearchParseException[[test-index][1]: query[Expiration:[20160215 TO 20160415]],from[-1],size[-1]: Parse Failure [Failed to parse source [{"query": {"range": {"Expiration": {"gte": "20160215", "lte": "20160415"}}, "bool": {"must": [{"term": {"Underlying": {"value": "eurodollar"}}}]}}}]]]; nested: ElasticsearchParseException[Expected field name but got START_OBJECT "bool"]; }]', {u'status': 400, u'error': u'SearchPhaseExecutionException[Failed to execute phase [query], all shards failed; shardFailures {[cCrh939sR7yHdKgawRi6Sw][test-index][0]: SearchParseException[[test-index][0]: query[Expiration:[20160215 TO 20160415]],from[-1],size[-1]: Parse Failure [Failed to parse source [{"query": {"range": {"Expiration": {"gte": "20160215", "lte": "20160415"}}, "bool": {"must": [{"term": {"Underlying": {"value": "eurodollar"}}}]}}}]]]; nested: ElasticsearchParseException[Expected field name but got START_OBJECT "bool"]; }{[cCrh939sR7yHdKgawRi6Sw][test-index][1]: SearchParseException[[test-index][1]: query[Expiration:[20160215 TO 20160415]],from[-1],size[-1]: Parse Failure [Failed to parse source [{"query": {"range": {"Expiration": {"gte": "20160215", "lte": "20160415"}}, "bool": {"must": [{"term": {"Underlying": {"value": "eurodollar"}}}]}}}]]]; nested: ElasticsearchParseException[Expected field name but got START_OBJECT "bool"]; }]'}) 

を取得していますこのだけを実行しました

{ 
    "query" : { 
     "bool" : { 
      "must" : [ 
       { 
        "term" : { 
         "Underlying" : { 
          "value" : "eurodollar" 
         } 
        } 
       } 
      ] 
     } 
    } 
} 

d期待される結果を得ました。

これは自分の状況を十分に示していると思います。どのように組み合わせるべきかに関する私の推測が間違っているので、これらのクエリを適切に組み合わせるにはどうすればよいですか。

答えて

5

あなたの範囲クエリは必見句内でなければなりません:

{ 
    "query" : { 
     "bool" : { 
      "must" : [ 
       { 
        "term" : { 
         "Underlying" : { 
          "value" : "eurodollar" 
         } 
        } 
       }, 
       { 
        "range" : { 
         "Expiration" : { 
          "gte" : "20160315", 
          "lte" : "20160515" 
         } 
        } 
       } 
      ] 
     } 
    } 
} 

あなたはboolクエリと異なるクエリを兼ね備えています。それには4つの異なる節があります:must,shouldnot_mustfilterです。

filterは、mustと同じです。フィルタのスコアはカウントされません。トリックをした

{ 
    "bool" : { 
     "must" : { 
      "term" : { "user" : "kimchy" } 
     }, 
     "filter": { 
      "term" : { "tag" : "tech" } 
     }, 
     "must_not" : {  <= single inside query 
      "range" : { 
       "age" : { "from" : 10, "to" : 20 } 
      } 
     }, 
     "should" : [  <= that is an array 
      {    <= start of inner query is important 
       "term" : { "tag" : "wow" } 
      }, 
      { 
       "term" : { "tag" : "elasticsearch" } 
      } 
     ] 
    } 
} 
+0

と基本的な構造(docから撮影)されます。ありがとうございました!! – Zack

+1

私はより多くの情報を追加しました。それも助けてくれることを願います。 – alpert

+0

非常に感謝します。クエリを構築するための私の方法はまだ非常にblackboxです - ish ...任意の情報が便​​利です。 – Zack

関連する問題