Как выполнить агрегацию конвейера, не возвращая все сегменты в Elasticsearch
Я использую Elasticsearch 2.3 и пытаюсь выполнить двухэтапное вычисление с использованием агрегации конвейеров. Меня интересует только конечный результат агрегации моего конвейера, но Elasticsearch возвращает всю информацию о контейнерах.
Поскольку у меня огромное количество ведер (десятки или сотни миллионов), это непозволительно. К сожалению, я не могу найти способ сказать Es не возвращать всю эту информацию.
Вот игрушечный пример. У меня есть индексtest-index
с типом документаobj
. obj
имеет два поля,key
а такжеvalues
.
curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{
"value": 100,
"key": "foo"
}'
curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{
"value": 20,
"key": "foo"
}'
curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{
"value": 50,
"key": "bar"
}'
curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{
"value": 60,
"key": "bar"
}'
curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{
"value": 70,
"key": "bar"
}'
Я хочу получить среднее значение (по всемkey
s) из минимумаvalue
изobj
с тем жеkey
s. Среднее из минимумов.
Elasticsearch позволяет мне сделать это:
curl -XPOST 'http://10.10.0.7:9200/test-index/obj/_search' -d '{
"size": 0,
"query": {
"match_all": {}
},
"aggregations": {
"key_aggregates": {
"terms": {
"field": "key",
"size": 0
},
"aggs": {
"min_value": {
"min": {
"field": "value"
}
}
}
},
"avg_min_value": {
"avg_bucket": {
"buckets_path": "key_aggregates>min_value"
}
}
}
}'
Но этот запрос возвращает минимум для каждого сегмента, хотя он мне и не нужен:
{
"took": 21,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 4,
"max_score": 0,
"hits": [
]
},
"aggregations": {
"key_aggregates": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "bar",
"doc_count": 2,
"min_value": {
"value": 50
}
},
{
"key": "foo",
"doc_count": 2,
"min_value": {
"value": 20
}
}
]
},
"avg_min_value": {
"value": 35
}
}
}
Есть ли способ избавиться от всей информации внутри"buckets": [...]
? Меня интересует толькоavg_min_value
.
Это может показаться не проблемой в этом примере игрушек, но когда количество различныхkey
s невелик (десятки или сотни миллионов), ответ на запрос слишком велик, и я хотел бы его сократить.
Есть ли способ сделать это с Elasticsearch? Или я неправильно моделирую свои данные?
Примечание: не допускается предварительная агрегация моих данных по ключу, посколькуmatch_all
часть моего запроса может быть заменена сложными и неизвестными фильтрами.
NB2: меняетсяsize
на неотрицательное число в моемterms
агрегация неприемлема, потому что это может изменить результат.