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: 0
voor ES versie 2 en eerder.
Het instellen van size:0
is 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 size
een 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":10000
Haal maximaal 10000 buckets. Standaard is 10. -
"size":0
Als resultaat bevat"hits"
standaard 10 documenten. We hebben ze niet nodig. -
Standaard worden de buckets gerangschikt op
doc_count
in 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+).
“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);
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
}
}
}
}'