2015-06-01 2 views
0

У меня есть документы в elasticsearch (1.5), который выглядит как:elasticsearch термины и агрегация сумма

{ 
    "gender": [ 
     { 
      "name": "unknown", 
      "value": 12 
     }, 
     { 
      "name": "male", 
      "value": 89 
     }, 
     { 
      "name": "female", 
      "value": 84 
     } 
    ] 
} 
  • не все документы, содержит три варианта (мужчина/женщина/неизвестен)

Я хотел бы получить сумму всех значений для каждого имени пола. как то:

{ 
    "buckets": [ 
     { 
      "key": "unknown", 
      "doc_count": 112, 
      "gender_a": { 
       "value": 462 
      } 
     }, 
     { 
      "key": "male", 
      "doc_count": 107, 
      "gender_a": { 
       "value": 438 
      } 
     }, 
     { 
      "key": "female", 
      "doc_count": 36, 
      "gender_a": { 
       "value": 186 
      } 
     } 
    ] 
} 

я попробовал этот запрос:

{ 
    "aggs": { 
     "gender_name": { 
      "terms": { 
       "field": "gender.name" 
      }, 
      "aggs": { 
       "gender_sum": { 
        "sum": { 
         "field": "gender.value" 
        } 
       } 
      } 
     } 
    } 
} 

но что-то странное происходит, и я не получаю правильные значения.

любая идея, что мне не хватает?

ответ

4

Возможно, вам будет нужно знать, что ваше имущество "gender" имеет тип "nested". С этим я смог сделать следующее, что я думаю, что вы спрашиваете.

Сначала я создал простой индекс:

PUT /test_index 
{ 
    "mappings": { 
     "doc": { 
     "properties": { 
      "gender": { 
       "type": "nested", 
       "properties": { 
        "name": { 
        "type": "string" 
        }, 
        "value": { 
        "type": "long" 
        } 
       } 
      } 
     } 
     } 
    } 
} 

Затем добавил пару Документов

PUT /test_index/doc/1 
{ 
    "gender": [ 
     { 
      "name": "unknown", 
      "value": 12 
     }, 
     { 
      "name": "male", 
      "value": 89 
     }, 
     { 
      "name": "female", 
      "value": 84 
     } 
    ] 
} 

PUT /test_index/doc/2 
{ 
    "gender": [ 
     { 
      "name": "male", 
      "value": 8 
     }, 
     { 
      "name": "female", 
      "value": 4 
     } 
    ] 
} 

Тогда я был в состоянии получить общий счет от пола названия следующим образом:

POST /test_index/_search?search_type=count 
{ 
    "aggs": { 
     "genders": { 
     "nested": { 
      "path": "gender" 
     }, 
     "aggs": { 
      "gender_terms": { 
       "terms": { 
        "field": "gender.name" 
       }, 
       "aggs": { 
        "gender_name_value_sums": { 
        "sum": { 
         "field": "gender.value" 
        } 
        } 
       } 
      } 
     } 
     } 
    } 
} 
... 
{ 
    "took": 1, 
    "timed_out": false, 
    "_shards": { 
     "total": 1, 
     "successful": 1, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 2, 
     "max_score": 0, 
     "hits": [] 
    }, 
    "aggregations": { 
     "genders": { 
     "doc_count": 5, 
     "gender_terms": { 
      "doc_count_error_upper_bound": 0, 
      "sum_other_doc_count": 0, 
      "buckets": [ 
       { 
        "key": "female", 
        "doc_count": 2, 
        "gender_name_value_sums": { 
        "value": 88, 
        "value_as_string": "88.0" 
        } 
       }, 
       { 
        "key": "male", 
        "doc_count": 2, 
        "gender_name_value_sums": { 
        "value": 97, 
        "value_as_string": "97.0" 
        } 
       }, 
       { 
        "key": "unknown", 
        "doc_count": 1, 
        "gender_name_value_sums": { 
        "value": 12, 
        "value_as_string": "12.0" 
        } 
       } 
      ] 
     } 
     } 
    } 
} 

Код для использования:

http://sense.qbox.io/gist/d4533215806b858aa2cc1565546d167fdec3c973

+0

Не могли бы вы объяснить, почему мне нужно, чтобы он был вложен? Это единственный вариант? Или, может быть, где я могу найти документацию об этом? Благодаря! – Udy

+0

У Elasticsearch должен быть способ группировать документы. Вот достойное объяснение [когда использовать вложенный тип] (https://www.elastic.co/guide/en/elasticsearch/guide/current/nested-aggregation.html#_when_to_use_nested_objects). Другой вариант - это [родительские/дочерние отношения] (https://www.elastic.co/guide/en/elasticsearch/guide/current/parent-child.html), хотя это, вероятно, не самый лучший вариант использования, дело. –