Toon alle Elasticsearch-aggregatieresultaten/buckets en niet alleen 10

Ik probeer alle buckets op een aggregatie weer te geven, maar het lijkt erop dat alleen de eerste 10 worden weergegeven.

Mijn zoekopdracht:

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

Retouren:

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

Ik heb veel meer dan 10 sleutels voor deze aggregatie. In dit voorbeeld zou ik 145 sleutels hebben, en ik wil de telling voor elk van hen. Is er enige paginering op buckets? Kan ik ze allemaal krijgen?

Ik gebruik Elasticsearch 1.1.0


Antwoord 1, autoriteit 100%

De parameter size zou een parameter moeten zijn voor het voorbeeld van een zoekopdracht voor termen:

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

Gebruik size: 0voor ES versie 2 en eerder.

Het instellen van size:0is verouderd vanaf 2.x, vanwege geheugenproblemen in uw cluster met veldwaarden met een hoge kardinaliteit. Je kunt er meer over lezen in de github issue hier.

Het wordt aanbevolen om expliciet een redelijke waarde in te stellen voor sizeeen getal tussen 1 en 2147483647.


Antwoord 2, autoriteit 21%

Hoe alle buckets weergeven?

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

Opmerking

  • "size":10000Haal maximaal 10000 buckets. Standaard is 10.

  • "size":0Als resultaat bevat "hits"standaard 10 documenten. We hebben ze niet nodig.

  • Standaard worden de buckets gerangschikt op doc_countin aflopende volgorde.


Waarom krijg ik de foutmelding Fielddata is disabled on text fields by default?

Omdat veldgegevens standaard zijn uitgeschakeld voor tekstvelden. Als u niet wxplicitly een veldtypetoewijzing hebt gekozen, heeft deze de standaard dynamische toewijzingen voor tekenreeksvelden.

Dus in plaats van "field": "your_field"te schrijven, moet je "field": "your_field.keyword"hebben.


Antwoord 3, autoriteit 5%

Als je alle unieke waarden wilt krijgen zonder een magisch getal in te stellen (size: 10000), gebruik dan COMPOSIET AGGREGATIE(ES 6.5+).

Van officiële documentatie:

“Als u alle termen of alle combinaties van termen in een geneste termenaggregatie wilt ophalen u moet de SAMENGESTELDE AGGREGATIE gebruikenwaarmee u over alle mogelijke termen kunt pagineren in plaats van een grootte in te stellen groter is dan de kardinaliteit van het veld in de aggregatie van termen. De aggregatie van termen is bedoeld om de bovenste termen te retourneren en staat paginering niet toe.”

Implementatievoorbeeld 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);

Snippet uitvouwen


Antwoord 4, autoriteit 3%

Verhoog de grootte (2e grootte) tot 10000 in uw termaggregaties en u krijgt de bucket van grootte 10000. Standaard is deze ingesteld op 10.
Ook als u de zoekresultaten wilt zien, maakt u de 1e grootte op 1, kunt u 1 document zien, aangezien ES zowel zoeken als aggregeren ondersteunt.

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

Other episodes