2015-10-20 4 views
9

Ich versuche, einen ElasticSearch-Index nach einem Zeitbereich abzufragen, und zusätzlich habe ein Term einen bestimmten String-Wert.ElasticSearch abfragen, indem ein Bereich und ein Term-Match-JSON-Format kombiniert werden

Ich habe diese Abfrage versucht, die ziemlich einfach scheint:

{ 
    "query" : { 
    "bool": { 
     "must": [ 
     { 
      "match": { 
      "method": "/customer/help" 
      } 
     }, 
     { 
      "range" : { 
      "startTime": { 
       "from" : "2015-10-20T13:00-04:00", 
       "to" : "2015-10-20T14:00-04:00" 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

In diesem Fall möchte ich alle Dokumente innerhalb des vorgegebenen Zeitbereich, der auch ein Verfahren Wert von "/customer/help" haben.

In meinen Ergebnissen erhalte ich Ergebnisse, die innerhalb des Zeitbereichs liegen, aber ich bekomme Dokumente, die verschiedene Werte für das Feld "method" haben, wenn ich nur Ergebnisse mit "/customer/help" in diesem Feld möchte.

+1

Sind die verschiedenen Werte für "Methode" Feldwerte entweder "Kunde" oder "Hilfe" zusammen mit Ergebnissen, die die erwartete "Kunde/Hilfe" haben? In diesem Fall besteht das Problem darin, dass Elasticsearch das Feld analysiert (wahrscheinlich Standardanalysator, wenn Sie das Mapping nicht angegeben haben). Wenn Sie nicht erwarten, den Analysator für dieses Feld in Zukunft zu verwenden, können Sie die Eigenschaft "index": "not_analyzed" für dieses Feld festlegen. – eemp

+0

Die anderen Werte haben Kunde/ aber was ist seltsam ist, dass wenn ich eine Abfrage separat ausführen, wo ich den Bereich ausschließe, bekomme ich nur Ergebnisse, wo die Methode = "Kunde/Hilfe". –

+0

Was passierst du für die Größe param? Ist es nur ein Zufall und Sie sehen nur eine Teilmenge aller Ergebnisse, wenn Sie die Bereichsabfrage ausschneiden? – eemp

Antwort

13

In Ihrem Mapping müssen Sie method als not_analyzed (mit keyword Analysator oder analysiert) haben, und die Abfrage term verwenden soll. Auf diese Weise wird der Text, den Sie Index in der Methode indiziert wie als ein einzelnes Token und term stellt sicher, dass der Text, den Sie genau das Token in method indiziert Suche entspricht:

"method": { 
     "type": "string", 
     "index": "not_analyzed" 
    } 

Und die Abfrage, die Sie verwenden müssen:

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "term": { 
      "method": "/customer/help" 
      } 
     }, 
     { 
      "range": { 
      "startTime": { 
       "from": "2015-10-20T13:00-04:00", 
       "to": "2015-10-20T14:00-04:00" 
      } 
      } 
     } 
     ] 
    } 
    } 
} 
+0

Ja, es stellt sich heraus, dass es diese Zeichenfolge in Tokens umgewandelt hat, wodurch die Ergebnisse verzerrt wurden. Diese Antwort ist richtig und danke! Auch ich dachte, es wäre hilfreich, darauf hinzuweisen, dass die Verwendung der "match_phrase" -Abfrage anstelle der "match" -Abfrage auch die korrekten Ergebnisse erzielt, ohne den Index zu ändern. –

Verwandte Themen