2017-04-04 1 views
0

Ich benutze die Bool-Abfrage für die "müssen" und "muss nicht" -Funktion. Es funktioniert wie erwartet, bis ich zu einer Eigenschaft komme, die 3 Ebenen tief ist. zum Beispiel eine einfache Abfrage Spiel wie ...ElasticSearch | Bool Query

GET city/town/_search 
{ 
    "query": { 
     "match": { 
      "contact.residence.address": "Rocky Road" 
     } 
    } 

} 

funktioniert gut und die Ergebnisse zurückgibt, aber wenn ich das gleiche in einer Bool Abfrage tun wie ..

GET city/town/_search 
{ 
    "query": { 
     "bool": { 
     "must": [ 
      { 
       "term": { 
        "contact.residence.address": "Rocky Road" 
       } 
      } 
     ] 
     } 
    } 
} 

Rückkehr keine Ergebnisse. Warum ist das????? Denken Sie daran, andere bool Abfragen wie ..

GET city/town/_search 
{ 
    "query": { 
     "bool": { 
     "must": [ 
      { 
       "term": { 
        "store.name": "Hendersons" 
       } 
      } 
     ] 
     } 
    } 
} 

funktionieren gut! Es ist nur für jedes Feld, das 3 Ebenen tief ist, und sucht daher jeden Begriff, der prop1.prop3.prop3 ist

+0

Sie haben vielleicht verwenden 'contact.residence.address' Feld zugeordnet mit 'text' Typ. Wenn dies der Fall ist, dann funktioniert das Ersetzen von 'term' mit' match' in Ihrer zweiten Abfrage wie erwartet. Ich würde vorschlagen, dass Sie den Abschnitt lesen Warum stimmt der Begriff Abfrage nicht mit meinem Dokument überein? in offiziellen Dokumenten [hier] (https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html#query-dsl-term-query). – avr

Antwort

2

Der Grund ist, dass die erste Suche match Abfrage verwendet, während eine andere term Abfrage verwendet. Der Unterschied besteht darin, dass die Abfrage match den Analysator auf den Eingang anwendet, der die richtigen Ausdrücke liefert. term Abfrage analysiert Ihre Eingabe nicht und verwendet sie als einen einzelnen Begriff. Es könnte das gleiche Ergebnis für Eingaben wie „Hendersons“ aber für die Eingabe „Rocky Road“ gibt sie in zwei Begriffe aufgeteilt werden müssen, so müssen Sie match Abfrage

GET city/town/_search 
{ 
    "query": { 
     "bool": { 
     "must": [ 
      { 
       "match": { 
        "contact.residence.address": "Rocky Road" 
       } 
      } 
     ] 
     } 
    } 
} 
+0

Arbeitete wie ein Charme. Vielen Dank! – emarel

Verwandte Themen