2014-11-04 4 views
5

мне нужно агрегировать массив следующегоАгрегирование массив значений в elasticsearch

Два примера документа:

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

Я хочу, чтобы агрегировать cities массив, чтобы выяснить все citiestraveler пошли к. Я хочу что-то вроде этого:

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

Если total является длиной cities массива минус 1. Я попытался агрегацией терминов и сумма, но не могу выводить желаемый результат.

Изменения в структуре документа могут быть сделаны, поэтому, если что-то подобное мне поможет, я был бы рад узнать.

+0

У вас есть сопоставление для этого индекса, который вы можете предоставить? –

ответ

11

в документе размещенном выше «городов» не является массивом JSON, это объект JSON. Если изменение структуры документа является возможность я бы изменить города в документе, чтобы быть массивом объекта

пример документа:

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

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

    } 
] 

Вы бы тогда нужно установить города, чтобы иметь тип nested в отображении индекса

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

После чего вы можете использовать nested aggregation, чтобы подсчитать город для каждого пользователя. Запрос будет выглядеть примерно так:

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

Но разве этот двойной счет «saopaulo», так как я посетил его на 30-й день и 31-й день? –

+0

@PatrickVillela да я неправильно понял вопрос, я отредактировал ответ, используя мощность. Http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-metrics-cardinality-aggregation.html дает общее количество в отдельных городах, как хотелось бы, однако, нужно было бы вычесть -1 для учета общего количества, вероятно, общее количество не должно быть частью объекта/поля «городов» в любом случае и быть отдельным полем за пределами – keety

+0

Хорошо, я попробую это правильно и вернуться к вам –

Смежные вопросы