2017-09-25 3 views
0

Ich habe eine einfache AbfrageWie benutze query_string mit dem Filter in elasticsearch?

GET data/_search 
{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "prefix": { 
      "last_name": "test" 
      } 
     }, 
     { 
      "bool": { 
      "should": { 
       "query_string": { 
       "query": "henderson OR Boulder City OR Sloan", 
       "fields": [ 
        "city_*" 
       ] 
       } 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

Ich möchte die query_string zu einem Filter ändern. Ich bin mir nicht sicher, wie

 { 
      "bool": { 
      "should": { 
       "query_string": { 
       "query": "henderson OR Boulder City OR Sloan", 
       "fields": [ 
        "city_*" 
       ] 
       } 
      } 
      } 
     } 

in so etwas wie

 "filter": { 
     "query_string": { 
       "query": "henderson OR Boulder City OR Sloan", 
       "fields": [ 
        "city_*" 
       ] 
      } 
     } 

konvertieren und stellen Sie sicher, es filtert durch all diese Städte henderson OR Boulder City OR Sloan und damit alle Felder city_*.keyword

Irgendwelche Ideen?

Antwort

0

ändern

{ 
     "bool": { 
     "should": { 
      "query_string": { 
      "query": "henderson OR Boulder City OR Sloan", 
      "fields": [ 
       "city_*" 
      ] 
      } 
     } 
     } 
    } 

zu

{ 
     "bool": { 
     "filter": { 
      "query_string": { 
      "query": "henderson OR Boulder City OR Sloan", 
      "fields": [ 
       "city_*" 
      ] 
      } 
     } 
     } 
    } 

Ist dies Ihr gewünschtes Verhalten bekommen? Wenn Sie dieselbe Abfrage unter einem Filter verwenden, sollten Sie die gleichen Ergebnisse erhalten wie erwartet, aber die Bewertung wird nicht von der Abfrage gewichtet.

Bearbeiten - Eine weitere Empfehlung, die ich machen würde, die Abfrage ist dies einzustellen:

GET data/_search 
{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "prefix": { 
      "last_name": "test" 
      } 
     } 
     ], 
     "filter": [ 
     { 
      "query_string": { 
      "query": "henderson OR Boulder City OR Sloan", 
       "fields": [ 
       "city_*" 
       ] 
      } 
     } 
     ]   
    } 
    } 
} 

Edit 2 - Sie können in der Lage sein, sich zu bewegen, von query_string verwenden, wird diese Sie eine Geschwindigkeitssteigerung geben? (Man könnte auf den „shoulds“ ändern und in einem Filter verschachtelt werden soll, wenn man sie nicht gewerteten will)

GET data/_search 
{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "prefix": { 
      "last_name": "test" 
      } 
     } 
     ], 
     "should": [ 
     { 
      "match": { 
      "city_*": "henderson" 
      } 
     }, 
     { 
      "match": { 
      "city_*": "Boulder City" 
      } 
     }, 
     { 
      "match": { 
      "city_*": "Sloan" 
      } 
     } 
     ]   
    } 
    } 
} 
+0

es gibt mir die gleichen Ergebnissen .. meine Idee für die Verwendung von 'filter' das machen sollte Abfrage ein wenig schneller, aber es scheint, es dauert etwa die gleiche Zeit – Patrioticcow

+0

Filter und sollte, in dem Beispiel, das Sie angegeben haben, wird Ihnen die gleichen Ergebnisse (und ich nehme an, in etwa die gleichen Kosten). Der einzige Unterschied ist, dass der Wert nicht erreicht wird und der Filter nicht. – Miek

+0

@Patrioticcow Also das ist eine etwas andere Frage als nur die bestehende Abfrage zu aktualisieren, um als ein Filter zu fungieren, aber es gibt ein paar Ansätze, die Sie nehmen könnten. Es ist möglicherweise am besten, die Abfragezeichenfolgeoperation vollständig auszutauschen und einzelne Begriffe als ein Array zu durchsuchen. – Miek

Verwandte Themen