Cómo realizar una agregación de canalización sin devolver todos los depósitos en Elasticsearch
Estoy usando Elasticsearch 2.3 y estoy tratando de realizar un cálculo de dos pasos usando una agregación de canalización. Solo estoy interesado en el resultado final de mi agregación de canalización, pero Elasticsearch devuelve toda la información de los depósitos.
Como tengo una gran cantidad de cubos (decenas o cientos de millones), esto es prohibitivo. Desafortunadamente, no puedo encontrar una manera de decirle a Es que no devuelva toda esta información.
Aquí hay un ejemplo de juguete. Tengo un indicetest-index
con un tipo de documentoobj
. obj
tiene dos campos,key
yvalues
.
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"
}'
Quiero obtener el valor promedio (sobre todokey
s) del mínimovalue
deobj
s teniendo lo mismokey
s. Un promedio de mínimos.
Elasticsearch me permite hacer esto:
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"
}
}
}
}'
Pero esta consulta devuelve el mínimo para cada depósito, aunque no lo necesito:
{
"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
}
}
}
¿Hay alguna manera de deshacerse de toda la información que contiene?"buckets": [...]
? Solo me interesaavg_min_value
.
Esto puede no parecer un problema en este ejemplo de juguete, pero cuando el número de diferenteskey
s no es grande (decenas o cientos de millones), la respuesta de la consulta es prohibitivamente grande y me gustaría podarla.
¿Hay alguna manera de hacer esto con Elasticsearch? ¿O estoy modelando mis datos incorrectamente?
NB: no es aceptable agregar previamente mis datos por clave, ya quematch_all
parte de mi consulta podría ser reemplazada por filtros complejos y desconocidos.
NB2: cambiandosize
a un número no negativo en miterms
la agregación no es aceptable porque cambiaría el resultado.