2016-07-19 3 views
0

Ich habe eine index mit vielen documents in diesem Format:Wie bekomme ich das neueste Dokument nach einem Feld gruppiert?

{ 
    "userId": 1234, 
    "locationDate" "2016-07-19T19:24:51+0000", 
    "location": { 
     "lat": -47.38163, 
     "lon": 26.38916 
    } 
} 

In diesem Index I von den Benutzern Inkrementalpositionen habe, alle paar Sekunden aktualisiert.

würde Ich mag eine Suche auszuführen, die mir die letzte Position (sortiert nach locationDate) von jedem Benutzer (gruppiert nach userId)

Ist das möglich mit Elasticsearch zurückkehren würde? das Beste, was ich tun konnte, war, alle Positionen aus den letzten 30 Sekunden zu erhalten, mit diesem:

{"query":{ 
    "filtered" : { 
    "query" : { 
     "match_all" : { } 
    }, 
    "filter" : { 
     "range" : { 
     "locationDate" : { 
      "from" : "2016-07-19T18:54:51+0000", 
      "to" : null, 
      "include_lower" : true, 
      "include_upper" : true 
     } 
     } 
    } 
    } 
}} 

Und dann nach, dass ich sie von Hand aussortieren, aber ich möchte diese auf Elasticsearch

direkt tun

WICHTIG: ich verwende Elasticsearch 1.5.2

Antwort

1

Versuchen Sie dies (mit Aggregationen):

{ 
    "query": { 
    "filtered": { 
     "query": { 
     "match_all": {} 
     }, 
     "filter": { 
     "range": { 
      "locationDate": { 
      "from": "2016-07-19T18:54:51+0000", 
      "to": null, 
      "include_lower": true, 
      "include_upper": true 
      } 
     } 
     } 
    } 
    }, 
    "aggs": { 
    "byUser": { 
     "terms": { 
     "field": "userId", 
     "size": 10 
     }, 
     "aggs": { 
     "firstOne": { 
      "top_hits": { 
      "size": 1, 
      "sort": [ 
       { 
       "locationDate": { 
        "order": "desc" 
       } 
       } 
      ] 
      } 
     } 
     } 
    } 
    } 
} 
+0

die 'order' versagt. Ist das die richtige Syntax? Ich erhalte folgende Nachricht: "AggregationExecutionException [Ungültiger Aggregator-Auftragspfad [locationDate]. Unbekannte Aggregation [locationDate]]}]" –

+0

Entschuldigung. Das habe ich blind vorausgesetzt. Ich habe die Antwort mit etwas aktualisiert, das funktionieren sollte. –

Verwandte Themen