Подтвердить что ты не робот

Запросить все уникальные значения поля с помощью Elasticsearch

Как искать все уникальные значения заданного поля с помощью Elasticsearch?

У меня такой тип запроса, как select full_name from authors, поэтому я могу отображать список для пользователей в форме.

4b9b3361

Ответ 1

Вы можете сделать грань терминов в поле "full_name". Но для того, чтобы сделать это должным образом, вам нужно убедиться, что вы не маркируете его во время индексации, иначе каждая запись в фасет будет другим термином, который является частью содержимого поля. Скорее всего, вам нужно настроить его как "not_analyzed" в вашем сопоставлении. Если вы также выполняете поиск по нему, и вы все еще хотите его использовать, вы можете просто индексировать его двумя разными способами, используя многопользовательское поле.

Также необходимо учитывать, что в зависимости от количества уникальных терминов, которые являются частью поля full_name, эта операция может быть дорогостоящей и требует довольно некоторой памяти.

Ответ 2

Для 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.

Ответ 3

Существующие ответы не помогли мне в Elasticsearch 5.X по следующим причинам:

  • Мне нужно было токенизировать мой ввод при индексировании.
  • "size": 0 не удалось выполнить синтаксический анализ, потому что "[размер] должен быть больше 0".
  • "По умолчанию поляданные отключены в текстовых полях" . Это означает, что по умолчанию вы не можете искать в поле full_name. Однако для агрегаций можно использовать неанализируемое поле keyword.

Решение 1: используйте API прокрутки. Он работает, сохраняя контекст поиска и делая несколько запросов, каждый раз возвращая последующие партии результатов. Если вы используете Python, модуль elasticsearch имеет scan() вспомогательную функцию, чтобы обрабатывать прокрутку для вас и возвращать все результаты.

Решение 2: используйте Search After API. Он похож на Scroll, но обеспечивает живой курсор вместо сохранения контекста поиска. Таким образом, он более эффективен для запросов в режиме реального времени.

Ответ 4

Работа для 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, которые являются надмножеством граней.