Mostrar todos los resultados/depósitos de agregación de Elasticsearch y no solo 10
Estoy intentando enumerar todos los depósitos de una agregación, pero parece que solo se muestran los primeros 10.
Mi búsqueda:
curl -XPOST "http://localhost:9200/imoveis/_search?pretty=1" -d'
{
"size": 0,
"aggregations": {
"bairro_count": {
"terms": {
"field": "bairro.raw"
}
}
}
}'
Devoluciones:
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 16920,
"max_score" : 0.0,
"hits" : [ ]
},
"aggregations" : {
"bairro_count" : {
"buckets" : [ {
"key" : "Barra da Tijuca",
"doc_count" : 5812
}, {
"key" : "Centro",
"doc_count" : 1757
}, {
"key" : "Recreio dos Bandeirantes",
"doc_count" : 1027
}, {
"key" : "Ipanema",
"doc_count" : 927
}, {
"key" : "Copacabana",
"doc_count" : 842
}, {
"key" : "Leblon",
"doc_count" : 833
}, {
"key" : "Botafogo",
"doc_count" : 594
}, {
"key" : "Campo Grande",
"doc_count" : 456
}, {
"key" : "Tijuca",
"doc_count" : 361
}, {
"key" : "Flamengo",
"doc_count" : 328
} ]
}
}
}
Tengo mucho más de 10 claves para esta agregación. En este ejemplo tendría 145 claves y quiero el recuento de cada una de ellas. ¿Hay alguna paginación en los depósitos? ¿Puedo conseguirlos todos?
Estoy usando Elasticsearch 1.1.0
El parámetro de tamaño debe ser un parámetro para el ejemplo de consulta de términos:
curl -XPOST "http://localhost:9200/imoveis/_search?pretty=1" -d'
{
"size": 0,
"aggregations": {
"bairro_count": {
"terms": {
"field": "bairro.raw",
"size": 10000
}
}
}
}'
Úselo size: 0
para ES versión 2 y anteriores.
La configuración size:0
está obsoleta a partir de 2.x, debido a problemas de memoria causados en su clúster con valores de campo de alta cardinalidad. Puedes leer más sobre esto en la edición de github aquí .
Se recomienda establecer explícitamente un valor razonable para size
un número entre 1 y 2147483647.
¿Cómo mostrar todos los depósitos?
{
"size": 0,
"aggs": {
"aggregation_name": {
"terms": {
"field": "your_field",
"size": 10000
}
}
}
}
Nota
"size":10000
Obtenga como máximo 10000 depósitos. El valor predeterminado es 10."size":0
Como resultado,"hits"
contiene 10 documentos por defecto. No los necesitamos.De forma predeterminada, los depósitos están ordenados en
doc_count
orden decreciente.
¿Por qué recibo
Fielddata is disabled on text fields by default
un error?
Porque los datos de campo están deshabilitados en los campos de texto de forma predeterminada . Si no ha elegido explícitamente una asignación de tipo de campo, tiene las asignaciones dinámicas predeterminadas para campos de cadena .
Entonces, en lugar de escribir "field": "your_field"
necesitas tener "field": "your_field.keyword"
.
Si desea obtener todos los valores únicos sin establecer un número mágico ( size: 10000
), utilice AGREGACIÓN COMPUESTA (ES 6.5+) .
De la documentación oficial :
"Si desea recuperar todos los términos o todas las combinaciones de términos en una agregación de términos anidados, debe utilizar la AGREGACIÓN COMPUESTA que permite paginar todos los términos posibles en lugar de establecer un tamaño mayor que la cardinalidad del campo en la agregación de términos. La agregación de términos está destinada a devolver los términos principales y no permite la paginación".
Ejemplo de implementación en JavaScript:
const ITEMS_PER_PAGE = 1000;
const body = {
"size": 0, // Returning only aggregation results: https://www.elastic.co/guide/en/elasticsearch/reference/current/returning-only-agg-results.html
"aggs" : {
"langs": {
"composite" : {
"size": ITEMS_PER_PAGE,
"sources" : [
{ "language": { "terms" : { "field": "language" } } }
]
}
}
}
};
const uniqueLanguages = [];
while (true) {
const result = await es.search(body);
const currentUniqueLangs = result.aggregations.langs.buckets.map(bucket => bucket.key);
uniqueLanguages.push(...currentUniqueLangs);
const after = result.aggregations.langs.after_key;
if (after) {
// continue paginating unique items
body.aggs.langs.composite.after = after;
} else {
break;
}
}
console.log(uniqueLanguages);
Aumente el tamaño (segundo tamaño) a 10000 en sus agregaciones de términos y obtendrá el depósito de tamaño 10000. De forma predeterminada está configurado en 10. Además, si desea ver los resultados de la búsqueda, simplemente haga que el primer tamaño sea 1, puede consulte 1 documento, ya que ES admite tanto la búsqueda como la agregación.
curl -XPOST "http://localhost:9200/imoveis/_search?pretty=1" -d'
{
"size": 1,
"aggregations": {
"bairro_count": {
"terms": {
"field": "bairro.raw",
"size": 10000
}
}
}
}'