Pokaż wszystkie wyniki / segmenty agregacji Elasticsearch, a nie tylko 10


166

Próbuję wyświetlić wszystkie zasobniki w agregacji, ale wydaje się, że pokazuje tylko pierwsze 10.

Moje wyszukiwanie:

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

Zwroty:

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

Mam znacznie więcej niż 10 kluczy do tej agregacji. W tym przykładzie miałbym 145 kluczy i chciałbym policzyć dla każdego z nich. Czy w zasobnikach jest jakaś paginacja? Czy mogę dostać je wszystkie?

Używam Elasticsearch 1.1.0

Odpowiedzi:


196

Parametr rozmiaru powinien być parametrem dla przykładu zapytania dotyczącego haseł:

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

Jak wspomniano w dokumencie, działa tylko od wersji 1.1.0

Edytować

Aktualizacja odpowiedzi na podstawie komentarza @PhaedrusTheGreek.

size:0to ustawienie jest przestarzałe w wersji 2.x i nowszej z powodu problemów z pamięcią występujących w klastrze przy użyciu wartości pól o wysokiej kardynalności. Więcej na ten temat przeczytasz w numerze github tutaj .

Zaleca się jawne ustawienie rozsądnej wartości dla sizeliczby od 1 do 2147483647.


8
Zwróć uwagę, że ustawienie rozmiaru: 0 jest teraz przestarzałe z powodu problemów z pamięcią, które wystąpiły w klastrze z wartościami pól o wysokiej kardynalności. github.com/elastic/elasticsearch/issues/18838 . Zamiast tego należy użyć prawdziwej, rozsądną liczbę od 1 do 2147483647.
PhaedrusTheGreek

dzięki @PhaedrusTheGreek za wskazanie tego, zredagowałem odpowiedź, aby uwzględnić Twój komentarz.
keety

0 działa na 2.5.2. co masz na myśli mówiąc 2.x dalej? masz na myśli po wersji 5? Jestem również ciekawy, jakie problemy z pamięcią mogą to spowodować, jeśli chcę zwrócić wszystkie możliwe agresy, jaka byłaby różnica między ustawieniem 0 (wartość maksymalna) a 10000 (duża górna granica)?
batmaci

4
@batmaci został wycofany w wersji 2.x, więc nadal działał i został usunięty z wersji 5.x
keety

@batmaci Uważam, że użycie rozmiaru: <duża liczba> nie wymaga mniej pamięci, ale po prostu wyjaśnia klientowi, że istnieje koszt wydajności. Myślę, że to jest powód wycofania się size:0. Więcej o tym przeczytacie w tym wydaniu na
githubie

37

Jak wyświetlić wszystkie segmenty?

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

Uwaga

  • "size":10000Zdobądź maksymalnie 10000 wiader. Wartość domyślna to 10.

  • "size":0W rezultacie "hits"zawiera domyślnie 10 dokumentów. Nie potrzebujemy ich.

  • Domyślnie zasobniki są sortowane doc_countmalejąco.


Dlaczego pojawia się Fielddata is disabled on text fields by defaultbłąd?

Ponieważ dane pól są domyślnie wyłączone w polach tekstowych . Jeśli nie wybrałeś jawnie mapowania typu pola, ma ono domyślne odwzorowania dynamiczne dla pól łańcuchowych .

Więc zamiast pisać "field": "your_field", musisz mieć "field": "your_field.keyword".


Czy większy rozmiar zasobników wpływa na wydajność (czas wykonania zapytania) elastycznego zapytania wyszukiwania?
user3522967

Jak możemy dodać paginację do segmentów?
Miind

7

Zwiększ rozmiar (drugi rozmiar) do 10000 w agregacjach terminów, a otrzymasz segment o rozmiarze 10000. Domyślnie jest to 10. Również jeśli chcesz zobaczyć wyniki wyszukiwania, ustaw pierwszy rozmiar na 1, możesz zobacz 1 dokument, ponieważ ES obsługuje zarówno wyszukiwanie, jak i agregację.

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

         }
      }
   }
}'

4

Jeśli chcesz uzyskać wszystkie unikalne wartości bez ustawiania magicznej liczby ( size: 10000), użyj AGREGACJI KOMPOZYTU (ES 6.5+) .

Z oficjalnej dokumentacji :

„Jeśli chcesz pobrać wszystkie terminy lub wszystkie ich kombinacje w zagnieżdżonej agregacji terminów , użyj AGREGACJI KOMPOZYTOWEJ która umożliwia stronicowanie wszystkich możliwych terminów zamiast ustawiania rozmiaru większego niż liczność pola w agregacji terminów. agregacja terminów ma na celu zwrócenie najpopularniejszych haseł i nie pozwala na podział na strony ”.

Przykład implementacji w 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);

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.