2016-07-20 2 views
1

Не знаете, как сформулировать вопрос. Я использую Elasticsearch 2.2.Elasticsearch: агрегат на двух полях

Давайте начнем с примера набора данных, из 5 документов:

[ 
    { 
    "header": { 
     "called_entity": { "uuid": "a" }, 
     "coverage_entity": {}, 
     "sucessful_transfers": 1 
    } 
    }, 
    { 
    "header": { 
     "called_entity": { "uuid": "a" }, 
     "coverage_entity": { "uuid": "b" }, 
     "sucessful_transfers": 1 
    } 
    }, 
    { 
    "header": { 
     "called_entity": { "uuid": "b" }, 
     "coverage_entity": { "uuid": "a" }, 
     "sucessful_transfers": 1 
    } 
    }, 
    { 
    "header": { 
     "called_entity": { "uuid": "b" }, 
     "coverage_entity": { "uuid": "a" }, 
     "sucessful_transfers": 0 
    } 
    } 
] 

called_entity всегда имеет UUID. coverage_entity может быть пустым или иметь uuid.

То, что я хочу, чтобы агрегировать на любой called_entity.uuid или coverage_entity.uuid, а затем подсчитать общее количество документов и сумму successful_transfers. Таким образом, для этих 5 документов, я бы что-то подобное, что в результате:

uuid,doc_count,successful_transfers_count 
"a",4,3 
"b",3,2 

Проблема заключается в том, что это означает, что один и тот же документ может быть использован на несколько агрегатов, до тех пор, пока ключ агрегации либо в called_entity.uuid или coverage_entity.uuuid (я даже не уверен, что это возможно, поэтому я публикую здесь).

То, что я сейчас делаю просто агрегирование на called_entity.uuid поле, но, конечно, это не достаточно:

{ 
    "size": 0, 
    "query": { 
    "match_all": {} 
    }, 
    "aggs": { 
    "dim_1": { 
     "terms": { 
     "field": "header.called_entity.uuid", 
     "size": 0 
     }, 
     "aggs": { 
     "successful_transfers": { 
      "sum": { 
      "field": "header.successful_transfers" 
      } 
     } 
     } 
    } 
    } 
} 

Что дает мне что-то вроде:

uuid,doc_count,successful_transfers_count 
"a",2,2 
"b",2,1 

. .. Это не то, что я хочу. Итак, как я могу агрегировать по нескольким значениям, или для данной агрегации, вычислить данные на основе значений, присутствующих во всех документах (а не только в агрегировании)?

спасибо.

ответ

1
{ 
    "size": 0, 
    "query": { 
    "match_all": {} 
    }, 
    "aggs": { 
    "dim1": { 
     "terms": { 
     "script" : "return doc['header.called_entity.uuid'] + doc['header.coverage_entity.uuid']", 
     "size": 10 
     }, 
     "aggs": { 
     "successful_transfers": { 
      "sum": { 
      "field": "header.successful_transfers" 
      } 
     } 
     } 
    } 
    } 
} 
+0

... Черт. Оно работает. Спасибо большое. Не могли бы вы объяснить, как это работает? – Raphael

+1

Это агрегирование генерирует термины из обоих полей: 'called_entity.uuid' и' coverage_entity.uuid', используя этот скрипт. Ваше агрегирование рассматривало только одно поле, и, как вы сказали, вам нужны значения обоих одновременно. –

+0

Хорошо, мне кажется, я знаю, как он работает внутри. Большое спасибо. – Raphael

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