2014-09-26 13 views
5

ich einige Daten nach Wochentag und Stunde gruppiert tun müssen, um bekommen, zum BeispielElasticsearch - Gruppe nach Wochentag und Stunde

curl -XGET http://localhost:9200/testing/hello/_search?pretty=true -d ' 
{ 
     "size": 0, 
     "aggs": { 
      "articles_over_time" : { 
      "date_histogram" : { 
       "field" : "date", 
       "interval" : "hour", 
       "format": "E - k" 
      } 
      } 
     } 
} 
' 

gibt mir diese:

{ 
    "took" : 2, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 5, 
    "successful" : 5, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 2857, 
    "max_score" : 0.0, 
    "hits" : [ ] 
    }, 
    "aggregations" : { 
    "articles_over_time" : { 
     "buckets" : [ { 
     "key_as_string" : "Fri - 17", 
     "key" : 1391792400000, 
     "doc_count" : 6 
     }, 
    ... 
     { 
     "key_as_string" : "Wed - 22", 
     "key" : 1411596000000, 
     "doc_count" : 1 
     }, { 
     "key_as_string" : "Wed - 22", 
     "key" : 1411632000000, 
     "doc_count" : 1 
     } ] 
    } 
    } 
} 

Jetzt brauche ich Um die Belegzahlen mit diesem Wert "Mi - 22" zusammenzufassen, wie kann ich das machen? Vielleicht ein anderer Ansatz?

Antwort

0

Sie können die Aggregation von Termen im Feld "key_as_string" aus den Aggregationsergebnissen mithilfe der Unteraggregation versuchen.

Hoffe, dass hilft.

1

Die gleiche Art von Problem wurde in this thread gelöst.

die Lösung für Ihr Problem anpassen, brauchen wir ein Skript machen das Datum in der Stunde des Tages und der Tag der Woche zu konvertieren:

Date date = new Date(doc['date'].value) ; 
java.text.SimpleDateFormat format = new java.text.SimpleDateFormat('EEE, HH'); 
format.format(date) 

Und es in einer Abfrage verwenden:

{ 
    "aggs": { 
     "perWeekDay": { 
      "terms": { 
       "script": "Date date = new Date(doc['date'].value) ;java.text.SimpleDateFormat format = new java.text.SimpleDateFormat('EEE, HH');format.format(date)" 
      } 
     } 
    } 
} 
0

Dies ist, weil Sie ein Intervall von "Stunde" verwenden, aber das Datumsformat ist "Tag" (E - k).

Ändern Sie Ihr Intervall zu "Tag", und Sie erhalten keine separaten Eimer für "Weds - 22".

Oder, wenn Sie pro Stunde wollen, dann ändern Sie Ihr Format, um das Stundenfeld einzuschließen.

+0

Ein Nachteil der Nicht-Skript-Lösung ist, dass Sie mehrere Werte pro Stunde erhalten, wenn die Abfrage mehrere Tage umfasst, ist meine aktuelle Lösung, dies auf der Client-Seite zu kombinieren, da ich nur Skripting zu öffnen vermeiden möchte dafür. – centic

+0

Nicht sicher, ob ich deinem Kommentar folge :-). Das Intervall und das Format sind miteinander verknüpft - das Intervall steuert das Bucketing, das Format steuert die Namen des Buckets. Wenn die Bucket-Namen alle eindeutig sein sollen, müssen Sie das Format entsprechend einstellen. ?! Alternativ kannst du 'key_as_string' ignorieren und stattdessen 'key' verwenden ;-). – RichS

+0

Mein Ziel ist es, eine "Stunde des Tages" historgram für einen längeren Zeitraum zu bekommen. Es sollte zeigen, wie viele Dinge um 1 Uhr morgens um 2 Uhr morgens um 3 Uhr morgens passiert sind. Wenn ich nun interval: "hour" und format: "HH" setze, bekomme ich die erwarteten stündlichen Buckets mit key_as_string "01", "02", ..., aber sie werden für jeden Tag wiederholt, also bekomme ich mehrere "01 ", und mehrere" 02 ", ... – centic

Verwandte Themen