Как мне получить значения всех languages
из записей и сделать их уникальными.
документация
PUT items/1
{ "language" : 10 }
PUT items/2
{ "language" : 11 }
PUT items/3
{ "language" : 10 }
запрос
GET items/_search
{ ... }
# => Expected Response
[10, 11]
Любая помощь была бы замечательной.
elasticsearch
ChuckJHardy
источник
источник
fields: [languages]
предоставит только значения данного поля, но сделать их уникальными, вероятно, проще в коде. Хотя, возможно, есть удобное агрегирование, которое сделает это за вас.Ответы:
Вы можете использовать термины агрегирование .
Поиск вернет что-то вроде:
size
Параметр в пределах агрегации указывает максимальное число членов включить в результате агрегации. Если вам нужны все результаты, установите для него значение, превышающее количество уникальных терминов в ваших данных.источник
"fields" : ["language"]
возвращает тот же результат. Можете ли вы расширить свой ответ, чтобы увидеть, может ли структура агрегирования возвращать только языковые значения?#=> [10, 11, 10]
language
вы можете добавитьsize=0
иshard_size=0
, чтобы убедиться, что вы получили все значения. См. Elasticsearch.org/guide/en/elasticsearch/reference/current/…Elasticsearch 1.1+ имеет агрегирование мощности, которое даст вам уникальный счет
Обратите внимание, что на самом деле это приближение, и точность может снизиться с наборами данных с высокой мощностью, но в целом в моем тестировании это довольно точно.
Вы также можете настроить точность с помощью
precision_threshold
параметра. Компромисс, конечно же, - использование памяти.Этот график из документации показывает, как более высокое значение
precision_threshold
приводит к гораздо более точным результатам.источник
Я ищу такое решение и для себя. Я нашел ссылку в терминах агрегирования .
Итак, в соответствии с этим правильным решением является следующее.
Но если вы столкнулись со следующей ошибкой:
В этом случае вы должны добавить в запрос « КЛЮЧЕВОЕ СЛОВО », как показано ниже:
источник
если вы хотите получить первый документ для каждого
language
уникального значения поля, вы можете сделать это:источник
Если вы хотите , чтобы получить все уникальные значения без какого - либо приближения или установив магическое число (
size: 500
), а затем использовать КОМПОЗИТНУЮ агрегацию (ES 6.5+) .Из официальной документации :
"Если вы хотите получить все термины или все комбинации терминов в агрегации вложенных терминов, вам следует использовать КОМПОЗИТНОЕ АГРЕГАЦИЯ, которое позволяет разбивать на страницы все возможные термины, а не устанавливать размер больше, чем количество элементов поля в агрегации терминов. агрегация терминов предназначена для возврата самых популярных терминов и не допускает разбиения на страницы ".
Пример реализации на JavaScript:
источник