Не знаете, как сформулировать вопрос. Я использую 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
. .. Это не то, что я хочу. Итак, как я могу агрегировать по нескольким значениям, или для данной агрегации, вычислить данные на основе значений, присутствующих во всех документах (а не только в агрегировании)?
спасибо.
... Черт. Оно работает. Спасибо большое. Не могли бы вы объяснить, как это работает? – Raphael
Это агрегирование генерирует термины из обоих полей: 'called_entity.uuid' и' coverage_entity.uuid', используя этот скрипт. Ваше агрегирование рассматривало только одно поле, и, как вы сказали, вам нужны значения обоих одновременно. –
Хорошо, мне кажется, я знаю, как он работает внутри. Большое спасибо. – Raphael