Как искать все уникальные значения заданного поля с помощью Elasticsearch?
У меня такой тип запроса, как select full_name from authors
, поэтому я могу отображать список для пользователей в форме.
Как искать все уникальные значения заданного поля с помощью Elasticsearch?
У меня такой тип запроса, как select full_name from authors
, поэтому я могу отображать список для пользователей в форме.
Вы можете сделать грань терминов в поле "full_name". Но для того, чтобы сделать это должным образом, вам нужно убедиться, что вы не маркируете его во время индексации, иначе каждая запись в фасет будет другим термином, который является частью содержимого поля. Скорее всего, вам нужно настроить его как "not_analyzed" в вашем сопоставлении. Если вы также выполняете поиск по нему, и вы все еще хотите его использовать, вы можете просто индексировать его двумя разными способами, используя многопользовательское поле.
Также необходимо учитывать, что в зависимости от количества уникальных терминов, которые являются частью поля full_name, эта операция может быть дорогостоящей и требует довольно некоторой памяти.
Для Elasticsearch 1.0 и более поздних версий вы можете использовать terms aggregation
для этого,
запрос DSL:
{
"aggs": {
"NAME": {
"terms": {
"field": "",
"size": 10
}
}
}
}
Реальный пример:
{
"aggs": {
"full_name": {
"terms": {
"field": "authors",
"size": 0
}
}
}
}
Затем вы можете получить все уникальные значения поля authors
.
size = 0 означает не ограничивать количество терминов (для этого требуется, чтобы es был равен 1.1.0 или новее).
Ответ:
{
...
"aggregations" : {
"full_name" : {
"buckets" : [
{
"key" : "Ken",
"doc_count" : 10
},
{
"key" : "Jim Gray",
"doc_count" : 10
},
]
}
}
}
Существующие ответы не помогли мне в Elasticsearch 5.X по следующим причинам:
"size": 0
не удалось выполнить синтаксический анализ, потому что "[размер] должен быть больше 0".full_name
. Однако для агрегаций можно использовать неанализируемое поле keyword
. Решение 1: используйте API прокрутки. Он работает, сохраняя контекст поиска и делая несколько запросов, каждый раз возвращая последующие партии результатов. Если вы используете Python, модуль elasticsearch имеет scan()
вспомогательную функцию, чтобы обрабатывать прокрутку для вас и возвращать все результаты.
Решение 2: используйте Search After API. Он похож на Scroll, но обеспечивает живой курсор вместо сохранения контекста поиска. Таким образом, он более эффективен для запросов в режиме реального времени.
Работа для Elasticsearch 5.2.2
curl -XGET http://localhost:9200/articles/_search?pretty -d '
{
"aggs" : {
"whatever" : {
"terms" : { "field" : "yourfield", "size":10000 }
}
},
"size" : 0
}'
"size":10000
означает получение (не более) 10000 уникальных значений. Без этого, если у вас более 10 уникальных значений, возвращается только 10 значений.
"size":0
означает, что в результате "hits"
не будет содержать никаких документов. По умолчанию возвращается 10 документов, которые нам не нужны.
Ссылка: агрегация сегментов ковша
Также обратите внимание, что в соответствии с эта страница, фасеты были заменены скоплениями в Elasticsearch 1.0, которые являются надмножеством граней.