2014-11-04 28 views
5

muszę agregować tablicę następującoAgregacja tablicę wartości w elasticsearch

Dwa przykłady dokumentu:

{ 
    "_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" 
     ] 
    } 
}, 

Chcę agregować tablicę cities, aby dowiedzieć się wszystkich citiestraveler upadł do. Chcę coś takiego:

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

Jeżeli total jest długość tablicy minus 1. Próbowałem agregację warunkach oraz sumę cities, ale nie mógł wyjście pożądany wynik.

Zmiany w strukturze dokumentu mogą być dokonane, więc gdyby coś takiego pomogło mi, byłbym zadowolony.

+0

Czy masz mapowanie dla tego indeksu, który możesz udostępnić? –

Odpowiedz

11

w dokumencie zamieszczonych powyżej „miastach” nie jest tablicą JSON, to jest obiekt JSON. Jeżeli zmiana struktury dokumentu jest możliwość chciałbym zmienić miast w dokumencie, aby być tablicą obiektu

przykład dokument:

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

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

    } 
] 

Będziesz wtedy trzeba ustawić miast być typu nested w odwzorowaniu indeksu

"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" 
       } 
      } 
     } 
     } 

Po czym można użyć nested aggregation aby liczyć miasto na użytkownika. Zapytanie powinno wyglądać następująco:

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

Ale czy ten podwójny licznik nie byłby "saopaulo", skoro odwiedziłem go 30 i 31 dnia? –

+0

@PatrickVillela tak, źle zrozumiałem pytanie, na podstawie którego zredagowałem odpowiedź za pomocą kardynalności http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-metrics-cardinality-aggregation.html, podając całkowitą liczbę poszczególne miasta są pożądane, jednak należałoby rozliczyć sumę -1 z sumą, prawdopodobnie suma nie powinna być ani częścią obiektu/pola "miast", ani być oddzielnym polem poza – keety

+0

OK, spróbuję to dobrze dalej i wracam do ciebie –