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

Я пытаюсь перечислить все ведра в агрегации, но, похоже, он показывает только первые 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

Ответ 1

Параметр size должен быть параметром для примера запроса терминов:

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.x, из-за проблем с памятью, вызванных вашим кластером, с высокими значениями поля. Подробнее об этом читайте в gitub здесь.

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

Ответ 2

Как показать все ведра?

{
  "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 ошибка?

Потому что полевые данные по умолчанию отключены для текстовых полей. Если вы явно не выбрали отображение типа поля, у него есть динамические отображения по умолчанию для строковых полей.

Таким образом, вместо того, чтобы писать "field": "your_field" вам нужно иметь "field": "your_field.keyword".

Ответ 3

Увеличьте размер (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

Но BTW, on https://github.com/elasticsearch/elasticsearch/issues/1776

был закрыт 22 июня, мой elasticsearch был загружен и установлен до этого дня, поэтому предположим, что вы можете получить его, если у вас есть последняя версия

Ответ 5

Когда размер составляет 10000, ES жалуется, что есть слишком много терминов.

Более простой способ состоит в том, чтобы иметь 2 агрегации, один отсортированный по возрастанию, а другой по убыванию, и подобрать минимальное и максимальное значения соответственно. Нечто подобное можно сделать ниже

"aggs": {
    "term_min": {
      "terms": {
        "field": "<field_name>",
        "order": {
          "_count": "asc"
        },
        "size": 1
      }
    },
    "min_count": {
      "min_bucket": {
        "buckets_path": "term_min._count"
      }
    },
    "term_max": {
      "terms": {
        "field": "<field_name>",
        "order": {
          "_count": "desc"
        },
        "size": 1
      }
    },
    "max_count": {
      "max_bucket": {
        "buckets_path": "term_max._count"
      }
    }
  }