Показати всі результати / відра Elasticsearch агрегації, а не лише 10


166

Я намагаюсь перерахувати всі відра для сукупності, але, здається, він показує лише перші 10.

Мій пошук:

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

Повернення:

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

У мене є набагато більше 10 ключів для цього агрегації. У цьому прикладі я маю 145 ключів, і я хочу рахувати кожен з них. Чи є якісь сторінки на відра? Чи можу я їх отримати?

Я використовую Elasticsearch 1.1.0

Відповіді:


196

Параметр розміру повинен бути параметром для прикладу запиту термінів:

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

Як зазначалося в документі, працює лише для версії 1.1.0

Редагувати

Оновлення відповіді на основі коментаря @PhaedrusTheGreek.

налаштування size:0застаріле в 2 рази, через проблеми з пам’яттю, завдані вашому кластеру із значеннями полів високої кардинальності. Більше про це можна прочитати у випуску github тут .

Рекомендується чітко встановити розумне значення для sizeчисла від 1 до 2147483647.


8
Зверніть увагу, що розмір налаштувань: 0 тепер застарілий через проблеми з пам'яттю, що завдані вашому кластеру із значеннями полів високої кардинальності. github.com/elastic/elasticsearch/isissue/18838 . Натомість використовуйте справжнє розумне число від 1 до 2147483647.
PhaedrusTheGreek

дякую @PhaedrusTheGreek за вказівку на це, я відредагував відповідь, щоб включити ваш коментар.
прихильний

0 працює на 2.5.2. що ти маєш на увазі на 2.x вперед? ти маєш на увазі після версії 5? Мені також цікаво, які проблеми з пам'яттю можуть викликати, якщо я хочу повернути всі можливі агги, яка буде різниця між встановленням 0 (max_value) та 10000 (деяка велика верхня межа)?
batmaci

4
@batmaci його застаріло в 2.x, тому він все ще працюватиме, і його видалили з 5.x
привітний

@batmaci Я вважаю, що використання розміру: <велика кількість> не менш об'єм пам'яті, але просто робить його більш чітким для клієнта, що існує вартість продуктивності. Я думаю, що це є підставою для знецінення size:0. Більше про це можна прочитати у цьому випуску
Github

37

Як показати всі відра?

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

Примітка

  • "size":10000Отримайте не більше 10000 відра. За замовчуванням - 10.

  • "size":0В результаті "hits"міститься 10 документів за замовчуванням. Нам вони не потрібні.

  • За замовчуванням відра впорядковуються doc_countу порядку зменшення.


Чому я отримую Fielddata is disabled on text fields by defaultпомилку?

Оскільки дані про поле відключені у текстових полях за замовчуванням . Якщо ви wxplicitly не вибрали відображення типу поля, у ньому є динамічні відображення за замовчуванням для рядкових полів .

Отже, замість того, щоб писати "field": "your_field", потрібно мати "field": "your_field.keyword".


Чи впливає більший розмір ковшів на ефективність (час виконання запиту) еластичного пошукового запиту?
користувач3522967

Як ми можемо додати сторінки для відра?
Мінд

7

Збільште розмір (2-й розмір) до 10000 у термінах агрегації, і ви отримаєте відро розміром 10000. За замовчуванням воно встановлено на 10. Також якщо ви хочете побачити результати пошуку, просто зробіть 1-й розмір на 1, ви можете див. 1 документ, оскільки ES підтримує як пошук, так і агрегацію.

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

         }
      }
   }
}'

4

Якщо ви хочете отримати всі унікальні значення без встановлення магічного числа ( size: 10000), використовуйте КОМПОЗИТНУ АГРЕГАЦІЮ (ES 6.5+) .

З офіційної документації :

"Якщо ви хочете отримати всі терміни або всі комбінації термінів в агрегації вкладених термінів, ви повинні використовувати КОМПОЗИТНУ АГРЕГАЦІЮ, яка дозволяє пропагувати всі можливі терміни, а не встановлювати розмір, більший, ніж простота поля в агрегації термінів. Агрегація термінів призначена для повернення основних термінів і не дозволяє пагінацію. "

Приклад реалізації в 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);

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.