Como executar uma agregação de pipeline sem retornar todos os buckets no Elasticsearch
Estou usando o Elasticsearch 2.3 e estou tentando executar uma computação em duas etapas usando uma agregação de pipeline. Estou interessado apenas no resultado final da agregação de meu pipeline, mas o Elasticsearch retorna todas as informações de buckets.
Como tenho um grande número de baldes (dezenas ou centenas de milhões), isso é proibitivo. Infelizmente, não consigo encontrar uma maneira de dizer a Es para não retornar todas essas informações.
Aqui está um exemplo de brinquedo. Eu tenho um índicetest-index
com um tipo de documentoobj
. obj
tem dois campos,key
evalues
.
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"
}'
Quero obter o valor médio (acima de tudokey
s) do mínimovalue
doobj
está tendo o mesmokey
s. Uma média de mínimos.
O Elasticsearch me permite fazer isso:
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"
}
}
}
}'
Mas essa consulta retorna o mínimo para cada intervalo, embora eu não precise:
{
"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
}
}
}
Existe uma maneira de se livrar de todas as informações dentro"buckets": [...]
? Eu só estou interessado emavg_min_value
.
Isso pode não parecer um problema neste exemplo de brinquedo, mas quando o número de diferenteskey
s não é grande (dezenas ou centenas de milhões), a resposta da consulta é proibitivamente grande e eu gostaria de removê-la.
Existe uma maneira de fazer isso com o Elasticsearch? Ou estou modelando meus dados de maneira errada?
NB: não é aceitável pré-agregar meus dados por chave, pois omatch_all
parte da minha consulta pode ser substituída por filtros complexos e desconhecidos.
NB2: mudandosize
para um número não negativo no meuterms
a agregação não é aceitável porque alteraria o resultado.