2016-06-23 9 views
1
GET dspdocs/_search 
{ 
"query": { 
    "filtered": { 
    "filter": { 
     "bool": { 
     "must": ["must_term1", "must_term2"], 
     "must_not": ["must_not_term", "must_not_term2"] 
     } 
     }, 
    "query": { 
     "match": { 
     "text": { 
      "query": "query_term", 
      "operator": "or" 
     } 
     } 
    } 
    } 
} 
} 

Ich versuche, die obige Abfrage auszuführen und ich erhalte den folgenden Fehler:gefilterte Abfragefehler

"type": "query_parsing_exception", 
"reason": "[_na] query malformed, must start with start_object", 

Ich weiß, das bedeutet, dass meine Frage richtig geschrieben wurde nicht oder ich habe es vermasselt Irgendeine Ordnung irgendwo, aber für das Leben von mir, ich kann nicht herausfinden, wo ich falsch gelaufen bin.

Ich versuche im Grunde, alle Dokumente herauszufiltern, die die Muss-Begriffe nicht enthalten und die must_not-Begriffe enthalten. Dann suche ich innerhalb des gefilterten Sets nach allen Dokumenten, in denen der query_term enthalten ist.

(ich die Filterung zunächst die Geschwindigkeit der Suche leicht zu erhöhen)

+0

Können Sie ein Beispiel von 'must_term1' und' must_not_term' gegeben? Sind sie Termabfragen oder nur ein 'query_term'? – keety

+0

Sie sind nur Zeichenfolgen, nur benötigt, um sie in Termabfragen wie pickypg unten gezeigten konvertieren und es funktioniert! –

Antwort

3

Ihr Problem ist im Beispiel:

... 
    "bool": { 
    "must": ["must_term1", "must_term2"], 
    "must_not": ["must_not_term", "must_not_term2"] 
    } 
    }, 
... 

Das Array von must und must_not (und should und filter für die Materie) erwartet entweder ein einzelnes Objekt oder ein Array Objekte. Zum Beispiel:

"bool": { 
    "must": [ 
    { 
     "term" : { 
     "my_field" : "must_term1" 
     } 
    }, 
    { 
     "term" : { 
     "my_field" : "must_term2" 
     } 
    } 
    ], 
    "must_not": [ 
    { 
     "term" : { 
     "my_field" : "must_not_term" 
     } 
    }, 
    { 
     "term" : { 
     "my_field" : "must_not_term2" 
     } 
    } 
    ] 
} 

Bitte beachte, dass ich die term Abfrage verwenden, aber Sie sind frei, jede Art der Abfrage zu verwenden. Mit Elasticsearch 2.x +, sollten Sie dies als eine reine bool Abfrage schreiben, anstatt ein filtered ein:

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "query_string" : { 
      "query" : "query_term" 
      } 
     } 
     ], 
     "must_not": [ 
     { 
      "term" : { 
      "my_field" : "must_not_term" 
      } 
     }, 
     { 
      "term" : { 
      "my_field" : "must_not_term2" 
      } 
     } 
     ], 
     "filter": [ 
     { 
      "term" : { 
      "my_field" : "must_term1" 
      } 
     }, 
     { 
      "term" : { 
      "my_field" : "must_term2" 
      } 
     } 
     ] 
    } 
    } 
} 
+0

perfekt danke! –

Verwandte Themen