Показывать все результаты/ковши агрегатов 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"
}
}
}