2016-04-01 5 views
1

Ich habe eine kurze Frage, die scheint einfach zu sein, aber ich konnte bisher keine Antwort finden.Elasticsearch GET das letzte Dokument für ein bestimmtes Feld, wenn es existiert

Ich möchte auf einem Elasticsearch-Knoten das letzte Dokument abrufen, das einem Datumsfeld zugewiesen wurde. Aber ich möchte das letzte Dokument haben, nur für Dokumente, die ein bestimmtes Feld enthalten.

Zum Beispiel lassen Sie uns sagen, dass ich die letzten Kauf erhalten möchten, die das Feld "Promotioncode" enthält:

Abfrage:

http://elasticsearch:9200/store1/purchase/_search?q=vendor:Marie&size=1&sort=date:desc 

wo store1 mein Index ist, Kauf ein Dokumenttyp

Lassen Sie uns jetzt sagen, ich habe diese beiden Dokumente in meinem Elasticsearch:

"hits": [ 
     { 
     "_index": "store1", 
     "_type": "purchase", 
     "_id": "1", 
     "_score": 1, 
     "_source": { 
      "date": "2016-03-16T12:53:16.000Z", 
      "vendor": "Marie", 
      "promotionCode": "XYZ123" 
     } 
     }, 
     { 
     "_index": "store1", 
     "_type": "purchase", 
     "_id": "2", 
     "_score": 1, 
     "_source": { 
      "date": "2016-03-18T12:53:16.000Z", 
      "vendor": "Marie" 
     } 
     } 
] 

Die obige Abfrage wird das Dokument von id 2, abrufen, aber ich werde kein Feld „Promotioncode“ in meinem Ergebnis.

Wenn ich das letzte Dokument mit einem bestimmten Feld erhalten möchte, wie mache ich das?

Ich erforschte „Felder“ Filter, sondern nur zurück Leeres Dokument senden, wenn das Feld nicht enthalten ist, und ich Quelle Filterung lesen, aber nicht sicher, ob es das tut, was ich will ...

Vielen Dank für irgendeinen Hinweis!

Antwort

3

Yo kann mit dieser Abfrage versuchen:

{ 
    "query": { 
     "term": { "vendor": "Marie" } 
    }, 
    "filter": { 
     "bool": { 
      "must_not": { "missing": { "field": "promotionCode" } } 
     } 
    }, 
    "sort": { "date" : "desc" }, 
    "size": 1 
} 
+0

Ich versuchte diese Abfrage: ' http: // Elasticsearch: 9200/store1/kaufen/_search?q = vendor: Marie & size = 100 & pretty = true & sort = sendDatum: desc & filter = {"bool": {"must_not": {"fehlendes": {"field": "promotionCode"}}} ' Aber es gab mir die 100 meisten zurück recents-Dokumente, auch wenn es nicht den "promotionCode" enthält. Mache ich das richtig ? – Alex

+0

Sie müssen den JSON auf einen Körper zu einer POST-Anfrage setzen. Wenn Sie Ansichtsergebnisse im Browser benötigen, können Sie die Erweiterung "postman" für Chrome verwenden. – skal88

+0

Oh ok, das ist, was ich dachte, es ist eine POST-Anfrage ... Ich habe bereits Postman (yup ist ein großer REST-Client!), Aber ich dachte, ich könnte es mit dem GET-Verb erreichen. – Alex

0

können Sie Exists Query

GET /store1/purchase/_search?q=vendor:Marie&size=1&sort=date:desc 
{ 

     "query": { 
    "exists" : { 
     "field" : "promotionCode" 
     } 
    } 

} 

Hoffe, es hilft verwenden !!

+0

ich diese Abfrage versucht: 'http: // Elasticsearch: 9200/store1/Kauf/_search q = Verkäufer: Marie & size = 100 & recht = true & sort = Senddate : desc & exists = promotionCode' und es gibt alle 100 neuesten Dokumente zurück, unabhängig vom Feld promotionCode. 'exists = {" Feld ":" promotionCode "}' das funktioniert nicht so gut in der Abfrage .. Vielleicht mache ich es falsch – Alex

+0

Selbst in POST konnte ich nicht arbeiten diese ... Ich habe ES 2.2 – Alex

+0

Welche Abfrage laufen Sie? Bitte geben Sie die genaue Anfrage an. – Richa

Verwandte Themen