Mostrar todos los resultados / cubos de agregación de Elasticsearch y no solo 10

166

Estoy tratando de enumerar todos los cubos en una agregación, pero parece que solo se muestran los primeros 10.

Mi busqueda:

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 cubos? ¿Puedo obtenerlos todos?

Estoy usando Elasticsearch 1.1.0

Samuel Rizzo
fuente

Respuestas:

196

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": 0
         }
      }
   }
}'

Como se menciona en el documento, solo funciona para la versión 1.1.0 en adelante

Editar

Actualización de la respuesta basada en el comentario de @PhaedrusTheGreek.

la configuración size:0está en desuso en 2.x en adelante, debido a problemas de memoria infligidos en su clúster con valores de campo de alta cardinalidad. Puede leer más al respecto en el tema de github aquí .

Se recomienda establecer explícitamente un valor razonable para sizeun número entre 1 y 2147483647.

keety
fuente
8
Tenga en cuenta que el tamaño de configuración: 0 ahora está en desuso, debido a problemas de memoria infligidos en su clúster con valores de campo de alta cardinalidad. github.com/elastic/elasticsearch/issues/18838 . En su lugar, use un número real y razonable entre 1 y 2147483647.
PhaedrusTheGreek
gracias @PhaedrusTheGreek por señalar esto, he editado la respuesta para incorporar su comentario.
keety
0 está trabajando en 2.5.2. ¿Qué quieres decir con 2.x en adelante? ¿quieres decir después de la versión 5? También tengo curiosidad por saber qué tipo de problemas de memoria puede causar si quiero devolver todos los aggs posibles, ¿cuál sería la diferencia entre establecer 0 (max_value) y 10000 (algún límite superior grande)?
batmaci
44
@batmaci estaba en desuso en 2.x, así que todavía funcionaría y se eliminó de 5.x
keety
@batmaci Creo que el uso del tamaño: <número grande> no requiere menos memoria pero solo hace más explícito al cliente que hay un costo de rendimiento. Creo que ese es el razonamiento detrás de despreciar size:0. Puede leer más sobre esto en este número de
github
37

¿Cómo mostrar todos los cubos?

{
  "size": 0,
  "aggs": {
    "aggregation_name": {
      "terms": {
        "field": "your_field",
        "size": 10000
      }
    }
  }
}

Nota

  • "size":10000Obtenga como máximo 10000 cubos. El valor predeterminado es 10.

  • "size":0En resultado, "hits"contiene 10 documentos por defecto. No los necesitamos

  • Por defecto, los cubos se ordenan por doc_countorden decreciente.


¿Por qué recibo un Fielddata is disabled on text fields by defaulterror?

Porque fielddata está deshabilitado 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 los campos de cadena .

Entonces, en lugar de escribir, "field": "your_field"debes tener "field": "your_field.keyword".

kgf3JfUtW
fuente
¿Tener un tamaño mayor para los depósitos afecta el rendimiento (tiempo de ejecución de la consulta) de la consulta de búsqueda elástica?
user3522967
¿Cómo podemos agregar paginación para los cubos?
Miind
7

Aumente el tamaño (segundo tamaño) a 10000 en sus agregaciones de términos y obtendrá el depósito del tamaño 10000. De forma predeterminada, se establece en 10. Además, si desea ver los resultados de búsqueda, simplemente haga el primer tamaño en 1, puede ver 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

         }
      }
   }
}'
preguntarse
fuente
4

Si desea obtener todos los valores únicos sin establecer un número mágico ( size: 10000), use 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 usar la AGREGACIÓN COMPUESTA que permite paginar sobre 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 debe 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);

Ilarion Halushka
fuente