2016-05-10 9 views
2

Ich habe ein wenig Schwierigkeiten zu verstehen, die verschiedenen Möglichkeiten zum Verschachteln von Abfragen in elastische Suche. Hier ist ein Beispiel dafür, was meine indizierten Daten sieht aus wie ..Schwierigkeit, Bool und Bereich Abfrage zu kombinieren, elastische Suche

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

So konnte ich eine Abfrage wie diese

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

Und wie erwartet laufen, bekomme ich alle Einträge. Nimm jedoch an, dass ich auch solche Einträge indiziert habe.

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

Ich möchte nicht, dass die "etwas anderes" Ergebnisse zurückkommen, also versuche ich jetzt, so etwas zu tun.

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

Aber ich bin immer einen Fehler

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"]; }]'}) 

Der relevanteste Text des Fehlers diese

Expected field name but got START_OBJECT "bool" 

ich meine Bool/term Abfrage kennen zu sein scheint funktioniert, weil ich lief nur diese

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

An d Ich habe die erwarteten Ergebnisse erhalten.

Ich denke, das veranschaulicht meine Situation gut genug. Wie kombiniere ich diese Abfragen richtig, wenn ich schätze, wie sie kombiniert werden sollen?

Antwort

5

Ihre Bereichsabfrage muss in der Maische-Klausel sein:

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

Sie verschiedene Abfragen mit bool Abfrage kombinieren. Und es sind 4 verschiedene Klauseln drin: must, should, und filter.

filter ist das gleiche wie must. Der Unterschied ist die Punktzahl für den Filter wird nicht gezählt.

Und Grundstruktur (aus doc):

{ 
    "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

, die den Trick tat. Vielen Dank!! – Zack

+1

Ich habe weitere Informationen hinzugefügt. Hoffe das hilft auch. – alpert

+0

Sehr geschätzt. Meine Methode zum Erstellen von Abfragen ist immer noch sehr Blackbox-ish ... jede Information ist nützlich. – Zack

Verwandte Themen