2016-07-19 28 views
1

Ich habe, wie nachstehend unter Elasticsearch Index viele Dokumente: Datum Histogramm/Bereich Aggregation auf mehreren Feldern machen und das Ergebnis in einer anderen Sammlung/indexElasticsearch wie Summenwerte nach der Aggregation Ergebnis

{ 
     "_index": "f2016-07-17", 
     "_type": "trkvjadsreqpxl.gif", 
     "_id": "AVX2N3dl5siG6SyfyIjb", 
     "_score": 1, 
     "_source": { 
      "time": "1468714676424", 
      "meta": { 
      "cb_id": 25681, 
      "mt_id": 649, 
      "c_id": 1592, 
      "revenue": 2.5, 
      "mt_name": "GMS-INAPP-EN-2.5", 
      "c_description": "COULL-INAPP-EN-2.5", 
      "domain": "wv.inner-active.mobi", 
      "master_domain": "649###wv.inner-active.mobi", 
      "child_domain": "1592###wv.inner-active.mobi", 
      "combo_domain": "25681###wv.inner-active.mobi", 
      "ip": "52.42.87.73" 
      } 
     } 
     } 

Ich möchte . So konnte ich doc_count Summe mit Abfrage/Aggregation zwischen Stunden Bereich machen.

Die Aggregation ist:

{ 
    "aggs": { 
    "hour":{ 
     "date_histogram": { 
     "field": "time", 
     "interval": "hour" 
     }, 
     "aggs":{ 
      "hourly_M_TAG":{ 
       "terms":{ 
        "field":"meta.mt_id" 
       } 
      } 
     }.... 
    } 
    } 
} 

Das Ergebnis wie erwartet:

"aggregations": { 
    "hour": { 
     "buckets": [ 
     { 
      "key_as_string": "2016-07-17T00:00:00.000Z", 
      "key": 1468713600000, 
      "doc_count": 94411750, 
      "hourly_M_TAG": { 
      "doc_count_error_upper_bound": 1485, 
      "sum_other_doc_count": 30731646, 
      "buckets": [ 
       { 
       "key": 10, 
       "doc_count": 10175501 
       }, 
       { 
       "key": 649, 
       "doc_count": 200000 
       }.... 
      ] 
      } 
     }, 
     { 
      "key_as_string": "2016-07-17T01:00:00.000Z", 
      "key": 1468717200000, 
      "doc_count": 68738743, 
      "hourly_M_TAG": { 
      "doc_count_error_upper_bound": 2115, 
      "sum_other_doc_count": 22478590, 
      "buckets": [ 
       { 
       "key": 559, 
       "doc_count": 8307018 
       }, 
       { 
       "key": 649, 
       "doc_count" :100000 
       }... 

Nehmen wir an, dass ich die Antwort analysieren und versuchen, das Ergebnis in anderen Index/Sammlung zu speichern.

Meine Frage

Was ist der beste Weg, um die aggregierten Ergebnisse zu speichern, so kann ich andere Abfrage/Aggregation machen, dass die „doc_count“ zwischen verschiedener Stunde Bereich fasst?

zum Beispiel: zwischen "2016-07-17T00: 00: 00.000Z" - "2016-07-17T01: 00: 00.000Z" wollen die Gesamt doc_count auf jeder Taste

erwartetes Ergebnis sehen:

{ 
      "range_sum": { 
      "buckets": [ 
       { 
       "key": 649, 
       "doc_count": 300000 // (200000+100000) 
       }, 
       { 
       "key": 588, 
       "doc_count": 2928548 // ... + ... 
       }.... 
      ] 
      } 
     } 

Danke!

Antwort

0

Ich könnte Ihr Endziel falsch, aber es scheint mir, wie Sie für jeden Wert von meta.mt_id, über konfigurierbare Zeitbereiche die Gesamt doc_count wollen?

Wenn dies der Fall ist Ich glaube nicht, dass Sie wirklich das Ergebnis der ersten Aggregation speichern müssen, Sie müssen nur den Intervallwert ändern, um die gewünschten Bucket-Größen widerzuspiegeln. Wenn Sie Summen für jeden Wert von meta.mt_id wollen, könnte es helfen, die Aggregation um zu drehen, so dass Sie zunächst auf Begriffe werden aggregiert und dann auf die Termine:

{ 
    "size": 0, 
    "aggs": { 
    "hourly_M_TAG": { 
     "terms": { 
     "field": "meta.mt_id" 
     }, 
     "aggs": { 
     "hour": { 
     "date_histogram": { 
      "field": "time", 
      "interval": "2h" 
     } 
     } 
    } 
    } 
} 

Dies wird Ihnen Ergebnisse für jede meta.mt_id, wenn Sie möchten, Wenn Sie Summen für einen bestimmten Zeitraum hinzufügen, ändern Sie einfach das Intervall, um dies widerzuspiegeln.

EDIT:

Es könnte einige intelligente Elasticsearch Art und Weise, dies zu tun, aber ich glaube, ich würde es so einfach tun:

foreach bucket in buckets: 
    index: 
     { 
      "id" : {meta.id}, 
      "timestamp" : {key_as_string} 
      "count" : {doc_count} 
     } 

Sie Ihre ursprüngliche Aggregation dann sollten Sie haben ein Index aller meta.id Dokumente mit ihren doc_count zu verschiedenen Zeitstempeln, die Granularität des Intervalls hängt davon ab, was Sie brauchen.

Dann können Sie einfach einen Begriff-> Summen-Aggregation auf dem neuen Index mit einem Bereich Filter (Annahme von Elasticsearch 2.x) für die Tage:

{ 
    "size": 0, 
    "filter": { 
    "range": { 
     "timestamp": { 
     "gte": "now-1h", 
     "lte": "now" 
     } 
    } 
    }, 
    "aggs": { 
    "termName": { 
     "terms": { 
     "field": "id" 
     }, 
     "aggs": { 
     "sumCounts": { 
      "sum": { 
      "field": "count" 
      } 
     } 
     } 
    } 
    } 
} 

Sorry, wenn das noch nicht das, was Sie suchen, ich glaube, es gibt diese viele verschiedene Möglichkeiten zu tun.

+0

Mic987: Ich habe klar das erwartete Ergebnis hinzugefügt. Ich muss die Ergebnisse speichern, weil die Anfrage vom Benutzer von jeder Stunde zu jeder Stunde sein kann, ein anderes Problem ist, dass ich keinen Speicher übrig habe, also aggregiere ich die Daten täglich, ohne diese Aggregation nach 1 Tag, Speicherplatzproblem würde auftreten . – VitalyT

+0

Ich habe meine Antwort aktualisiert, hoffentlich ist es von Nutzen, ich denke da gibt es viele verschiedene Möglichkeiten, wie du erreichen kannst, was du willst. – Mic987