2014-11-04 7 views
5

Ich brauche ein Array zu aggregieren alsAggregieren Array von Werten in Elasticsearch

Zwei Dokument Beispiele folgt:

{ 
    "_index": "log", 
    "_type": "travels", 
    "_id": "tnQsGy4lS0K6uT3Hwzzo-g", 
    "_score": 1, 
    "_source": { 
     "state": "saopaulo", 
     "date": "2014-10-30T17", 
     "traveler": "patrick", 
     "registry": "123123", 
     "cities": { 
      "saopaulo": 1, 
      "riodejaneiro": 2, 
      "total": 2 
     }, 
     "reasons": [ 
      "Entrega de encomenda" 
     ], 
     "from": [ 
      "CompraRapida" 
     ] 
    } 
}, 
{ 
    "_index": "log", 
    "_type": "travels", 
    "_id": "tnQsGy4lS0K6uT3Hwzzo-g", 
    "_score": 1, 
    "_source": { 
     "state": "saopaulo", 
     "date": "2014-10-31T17", 
     "traveler": "patrick", 
     "registry": "123123", 
     "cities": { 
      "saopaulo": 1, 
      "curitiba": 1, 
      "total": 2 
     }, 
     "reasons": [ 
      "Entrega de encomenda" 
     ], 
     "from": [ 
      "CompraRapida" 
     ] 
    } 
}, 

ich die cities Array aggregieren möchten, um herauszufinden, alle cities die traveler ist gegangen zu. Ich möchte etwas wie folgt aus:

{ 
    "traveler":{ 
     "name":"patrick" 
    }, 
    "cities":{ 
     "saopaulo":2, 
     "riodejaneiro":2, 
     "curitiba":1, 
     "total":3 
    } 
} 

Wo die total die Länge des cities Array minus 1. Ich nehme die Bedingungen Aggregation und die Summe versucht, aber konnte die gewünschte Ausgabe nicht ausgegeben.

Änderungen in der Dokumentstruktur können vorgenommen werden, wenn mir so etwas helfen würde, würde ich mich freuen zu wissen.

+0

Haben Sie eine Zuordnung für diesen Index, den Sie freigeben können? –

Antwort

11

im Dokument über „Städte“ geschrieben ist kein json Array, es ist ein JSON-Objekt. Wenn die Dokumentstruktur ändert die Möglichkeit besteht, würde ich Städte im Dokument ändert ein Array von Objekt sein

Beispieldokument:

cities : [ 
    { 
    "name" :"saopaulo" 
    "visit_count" :"2", 

    }, 
    { 
    "name" :"riodejaneiro" 
    "visit_count" :"1", 

    } 
] 

würden Sie dann Städte müssen gesetzt nested seine vom Typ in der Indexabbildung

"mappings": { 
     "<type_name>": { 
      "properties": { 
       "cities": { 
        "type": "nested", 
        "properties": { 
        "city": { 
         "type": "string" 
        }, 
        "count": { 
         "type": "integer" 
        }, 
        "value": { 
         "type": "long" 
        } 
        } 
       }, 
       "date": { 
        "type": "date", 
        "format": "dateOptionalTime" 
       }, 
       "registry": { 
        "type": "string" 
       }, 
       "state": { 
        "type": "string" 
       }, 
       "traveler": { 
        "type": "string" 
       } 
      } 
     } 
     } 

nach dem konnte man nested aggregation verwendet die Stadt zu erhalten pro Benutzer zählen. Die Abfrage würde etwas in diesen Zeilen aussehen:

{ 
    "query": { 
     "match": { 
     "traveler": "patrick" 
     } 
    }, 
    "aggregations": { 
     "city_travelled": { 
     "nested": { 
      "path": "cities" 
     }, 
     "aggs": { 
      "citycount": { 
       "cardinality": { 
        "field": "cities.city" 
       } 
      } 
     } 
     } 
    } 
} 
+0

Aber würde nicht dieses Doppel "Saopaulo" zählen, da ich es am Tag 30 und Tag 31 besucht habe? –

+0

@PatrickVillela yeah ich missverstand die Frage ich editierte die Antwort mit Kardinalität http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-metrics-cardinality-aggregation.html gibt die Gesamtzahl von die distinct cities wie gewollt aber man müsste sich mit dem -1 verbinden, um insgesamt zu rechnen, wahrscheinlich sollte total kein teil von "cities" objekt/field sein und ein eigenes feld außerhalb sein – keety

+0

Okay, ich werde es richtig versuchen weg und zurück zu dir –