Alle Elasticsearch-Aggregationsergebnisse / Buckets anzeigen und nicht nur 10


163

Ich versuche, alle Buckets in einer Aggregation aufzulisten, aber es scheint nur die ersten 10 anzuzeigen.

Meine Suche:

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

Kehrt zurück:

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

Ich habe viel mehr als 10 Schlüssel für diese Aggregation. In diesem Beispiel hätte ich 145 Schlüssel, und ich möchte die Anzahl für jeden von ihnen. Gibt es eine Paginierung bei Eimern? Kann ich alle bekommen?

Ich verwende Elasticsearch 1.1.0

Antworten:


194

Der Größenparameter sollte ein Parameter für das Abfragebeispiel für Begriffe sein:

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

Wie im Dokument erwähnt, funktioniert dies nur ab Version 1.1.0

Bearbeiten

Aktualisieren der Antwort basierend auf dem Kommentar von @PhaedrusTheGreek.

Die Einstellung size:0ist ab 2.x aufgrund von Speicherproblemen, die Ihrem Cluster mit Feldwerten mit hoher Kardinalität zugefügt wurden, veraltet. Weitere Informationen hierzu finden Sie in der Github- Ausgabe hier .

Es wird empfohlen, einen angemessenen Wert für sizeeine Zahl zwischen 1 und 2147483647 explizit festzulegen.


8
Beachten Sie, dass die Einstellungsgröße: 0 aufgrund von Speicherproblemen, die Ihrem Cluster mit Feldwerten mit hoher Kardinalität zugefügt wurden, jetzt veraltet ist. github.com/elastic/elasticsearch/issues/18838 . Verwenden Sie stattdessen eine echte, vernünftige Zahl zwischen 1 und 2147483647.
PhaedrusTheGreek

danke @PhaedrusTheGreek für den Hinweis, ich habe die Antwort bearbeitet, um Ihren Kommentar aufzunehmen.
Keety

0 arbeitet an 2.5.2. Was meinst du mit 2.x ab? meinst du nach version 5? Ich bin auch neugierig, welche Art von Speicherproblemen es verursachen kann, wenn ich alle möglichen Aggs zurückgeben möchte. Was wäre der Unterschied zwischen der Einstellung 0 (max_value) und 10000 (einige große Obergrenze)?
Batmaci

4
@ Batmaci es war in 2.x veraltet , würde also immer noch funktionieren und wurde aus 5.x entfernt
keety

@batmaci Ich glaube, dass die Verwendung von size: <big number> nicht weniger speicherintensiv ist, sondern dem Kunden nur deutlicher macht, dass es Leistungskosten gibt. Ich denke, das ist der Grund für die Ablehnung size:0. Sie können mehr darüber in dieser Github- Ausgabe
keety

37

Wie zeige ich alle Eimer?

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

Hinweis

  • "size":10000Holen Sie sich höchstens 10000 Eimer. Standard ist 10.

  • "size":0Das Ergebnis "hits"enthält standardmäßig 10 Dokumente. Wir brauchen sie nicht.

  • Standardmäßig werden die Eimer doc_countin absteigender Reihenfolge sortiert.


Warum bekomme ich einen Fielddata is disabled on text fields by defaultFehler?

Da Felddaten für Textfelder standardmäßig deaktiviert sind . Wenn Sie eine Feldtypzuordnung nicht explizit ausgewählt haben, verfügt sie über die dynamischen Standardzuordnungen für Zeichenfolgenfelder .

Also, anstatt zu schreiben "field": "your_field", müssen Sie haben "field": "your_field.keyword".


Beeinträchtigt eine größere Größe für Buckets die Leistung (Zeit bis zur Ausführung der Abfrage) der elastischen Suchabfrage?
user3522967

Wie können wir die Paginierung für die Eimer hinzufügen?
Miind

7

Wenn Sie die Größe (2. Größe) in Ihren Termaggregationen auf 10000 erhöhen, erhalten Sie den Bucket mit der Größe 10000. Standardmäßig ist er auf 10 eingestellt. Wenn Sie die Suchergebnisse anzeigen möchten, setzen Sie einfach die 1. Größe auf 1 siehe 1 Dokument, da ES sowohl die Suche als auch die Aggregation unterstützt.

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

         }
      }
   }
}'

3

Wenn Sie alle eindeutigen Werte erhaltensize: 10000 möchten, ohne eine magische Zahl ( ) festzulegen , verwenden Sie COMPOSITE AGGREGATION (ES 6.5+) .

Aus der offiziellen Dokumentation :

"Wenn Sie alle Begriffe oder alle Kombinationen von Begriffen in einer verschachtelten Begriffsaggregation abrufen möchten, sollten Sie die COMPOSITE AGGREGATION verwenden , mit der Sie über alle möglichen Begriffe paginieren können, anstatt eine Größe festzulegen, die größer ist als die Kardinalität des Felds in der Begriffsaggregation Die Aggregation von Begriffen soll die Top-Begriffe zurückgeben und erlaubt keine Paginierung. "

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.