Mostra tutti i risultati / i bucket di aggregazione di Elasticsearch e non solo 10


166

Sto cercando di elencare tutti i bucket in un'aggregazione, ma sembra mostrare solo i primi 10.

La mia ricerca:

curl -XPOST "http://localhost:9200/imoveis/_search?pretty=1" -d'
{
   "size": 0, 
   "aggregations": {
      "bairro_count": {
         "terms": {
            "field": "bairro.raw"
         }
      }
   }
}'

Ritorna:

{
  "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
      } ]
    }
  }
}

Ho molto più di 10 chiavi per questa aggregazione. In questo esempio avrei 145 chiavi e voglio il conteggio per ognuna di esse. C'è qualche impaginazione sui secchi? Posso prenderli tutti?

Sto usando Elasticsearch 1.1.0

Risposte:


196

Il parametro size dovrebbe essere un parametro per i termini esempio di query:

curl -XPOST "http://localhost:9200/imoveis/_search?pretty=1" -d'
{
   "size": 0,
   "aggregations": {
      "bairro_count": {
         "terms": {
            "field": "bairro.raw",
             "size": 0
         }
      }
   }
}'

Come menzionato nel documento, funziona solo per la versione 1.1.0 in poi

modificare

Aggiornamento della risposta in base al commento di @PhaedrusTheGreek.

l'impostazione size:0è obsoleta in 2.x in poi, a causa di problemi di memoria inflitti al cluster con valori di campo con cardinalità elevata. Puoi leggere di più al riguardo nel numero di github qui .

Si consiglia di impostare esplicitamente un valore ragionevole per sizeun numero compreso tra 1 e 2147483647.


8
Si noti che la dimensione dell'impostazione: 0 è ora obsoleta, a causa di problemi di memoria inflitti al cluster con valori di campo con cardinalità elevata. github.com/elastic/elasticsearch/issues/18838 . Invece, usa un numero reale, ragionevole compreso tra 1 e 2147483647.
PhaedrusTheGreek

grazie @PhaedrusTheGreek per averlo sottolineato, ho modificato la risposta per incorporare il tuo commento.
keety,

0 sta lavorando su 2.5.2. cosa intendi per 2.x in poi? intendi dopo la versione 5? Sono anche curioso di sapere che tipo di problemi di memoria può causare se desidero restituire tutti i possibili agg, quale sarebbe la differenza tra l'impostazione 0 (valore massimo) e 10000 (qualche limite superiore elevato)?
Batmaci,

4
@batmaci è stato deprecato in 2.x quindi funzionerebbe ancora ed è stato rimosso da 5.x
keety

@batmaci Credo che l'uso delle dimensioni: <big number> non sia meno dispendioso in termini di memoria ma rende solo più esplicito al cliente che ci sono costi di prestazione. Penso che sia il ragionamento alla base del deprezzamento size:0. Puoi leggere di più in questo numero di
keety,

37

Come mostrare tutti i secchi?

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

Nota

  • "size":10000Ottieni al massimo 10000 secchi. L'impostazione predefinita è 10.

  • "size":0Di conseguenza, "hits"contiene 10 documenti per impostazione predefinita. Non ne abbiamo bisogno.

  • Per impostazione predefinita, i bucket sono ordinati doc_countin ordine decrescente.


Perché visualizzo l' Fielddata is disabled on text fields by defaulterrore?

Perché fielddata è disabilitato sui campi di testo per impostazione predefinita . Se non è stato scelto in modo esplicito un mapping del tipo di campo, ha i mapping dinamici predefiniti per i campi stringa .

Quindi, invece di scrivere "field": "your_field"devi avere "field": "your_field.keyword".


Avere una dimensione maggiore per i bucket influisce sulle prestazioni (tempo di esecuzione della query) della query di ricerca elastica?
user3522967,

Come possiamo aggiungere l'impaginazione per i secchi?
Miind

7

Aumenta la dimensione (2a dimensione) a 10000 nelle aggregazioni dei termini e otterrai il bucket della dimensione 10000. Per impostazione predefinita, è impostato su 10. Inoltre, se vuoi vedere i risultati della ricerca, imposta la 1a dimensione su 1, puoi vedere 1 documento, poiché ES supporta sia la ricerca che l'aggregazione.

curl -XPOST "http://localhost:9200/imoveis/_search?pretty=1" -d'
{
   "size": 1,
   "aggregations": {
      "bairro_count": {
         "terms": {
             "field": "bairro.raw",
             "size": 10000

         }
      }
   }
}'

4

Se si desidera ottenere tutti i valori univoci senza impostare un numero magico ( size: 10000), utilizzare AGGREGAZIONE COMPOSITA (ES 6.5+) .

Dalla documentazione ufficiale :

"Se si desidera recuperare tutti i termini o tutte le combinazioni di termini in un'aggregazione di termini nidificati, è necessario utilizzare l'AGGREGAZIONE COMPOSITA che consente di impaginare su tutti i termini possibili anziché impostare una dimensione maggiore della cardinalità del campo nell'aggregazione dei termini. l'aggregazione dei termini ha lo scopo di restituire i termini principali e non consente l'impaginazione. "

Esempio di implementazione in 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);

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.