Агрегирование выборочного отбора
Подобно агрегированию sampler, это агрегирование фильтрации, используемое для ограничения обработки любых вложенных агрегаций выборкой из наиболее релевантных документов. Агрегирование diversified_sampler добавляет возможность ограничивать количество совпадений, имеющих общее значение, такое как "автор".
Любой хороший исследователь рынка скажет вам, что при работе с выборками данных важно, чтобы выборка представляла собой здоровое разнообразие мнений, а не была искажена каким-либо одним голосом. То же самое относится к агрегированию и выборочному отбору; с помощью этих настроек можно устранить предвзятость в вашем контенте (перенаселённый регион, большой скачок во временной шкале или активный спамер форума).
Примеры использования:
- Уточнение анализа, сосредоточившись на результатах с высокой релевантностью, а не на потенциально очень длинном хвосте результатов с низким качеством
- Устранение предвзятости в анализе, обеспечивая справедливое представление контента из разных источников
- Сокращение затрат на агрегирование, которое может давать полезные результаты, используя только выборки, например,
significant_terms
Настройка field используется для предоставления значений, используемых для исключения дубликатов, а настройка max_docs_per_value контролирует максимальное количество документов, собранных на любом одном фрагменте, которые имеют общее значение. Значение по умолчанию для max_docs_per_value равно 1.
Агрегирование выдаст ошибку, если field выведет несколько значений для одного документа (исключение дубликатов с использованием многозначных полей не поддерживается из-за проблем с производительностью).
Пример:
Мы можем захотеть увидеть, какие теги сильно связаны с #elasticsearch на форуме StackOverflow, но игнорируя влияние некоторых активных пользователей с тенденцией к неправильному написанию #Kibana как #Cabana.
POST /stackoverflow/_search?size=0
{
"query": {
"query_string": {
"query": "tags:elasticsearch"
}
},
"aggs": {
"my_unbiased_sample": {
"diversified_sampler": {
"shard_size": 200,
"field": "author"
},
"aggs": {
"keywords": {
"significant_terms": {
"field": "tags",
"exclude": [ "elasticsearch" ]
}
}
}
}
}
} Ответ:
{
...
"aggregations": {
"my_unbiased_sample": {
"doc_count": 151,
"keywords": {
"doc_count": 151,
"bg_count": 650,
"buckets": [
{
"key": "kibana",
"doc_count": 150,
"score": 2.213,
"bg_count": 200
}
]
}
}
}
} | В общей сложности было отобрано 151 документ. | |
| Результаты агрегирования significant_terms не искажены какими-либо особенностями одного автора, поскольку мы запросили не более одного поста от любого одного автора в нашей выборке. |
Пример с использованием скриптов
В этом сценарии мы можем захотеть получить разнообразие по комбинации значений полей. Мы можем использовать временное поле для создания хэша нескольких значений в поле тегов, чтобы убедиться, что наша выборка не содержит одни и те же повторяющиеся комбинации тегов.
POST /stackoverflow/_search?size=0
{
"query": {
"query_string": {
"query": "tags:kibana"
}
},
"runtime_mappings": {
"tags.hash": {
"type": "long",
"script": "emit(doc['tags'].hashCode())"
}
},
"aggs": {
"my_unbiased_sample": {
"diversified_sampler": {
"shard_size": 200,
"max_docs_per_value": 3,
"field": "tags.hash"
},
"aggs": {
"keywords": {
"significant_terms": {
"field": "tags",
"exclude": [ "kibana" ]
}
}
}
}
}
} Ответ:
{
...
"aggregations": {
"my_unbiased_sample": {
"doc_count": 6,
"keywords": {
"doc_count": 6,
"bg_count": 650,
"buckets": [
{
"key": "logstash",
"doc_count": 3,
"score": 2.213,
"bg_count": 50
},
{
"key": "elasticsearch",
"doc_count": 3,
"score": 1.34,
"bg_count": 200
}
]
}
}
}
} shard_size
Параметр shard_size ограничивает количество наиболее релевантных документов, собранных в выборке, обработанной на каждом фрагменте. Значение по умолчанию равно 100.
max_docs_per_value
max_docs_per_value — это необязательный параметр, ограничивающий количество документов, разрешенных на выбор дедуплицирующего значения. Значение по умолчанию равно «1».
execution_hint
Необязательная настройка execution_hint может повлиять на управление значениями, используемыми для исключения дубликатов. Каждый вариант будет хранить до shard_size значений в памяти во время выполнения дедупликации, но тип хранимых значений можно контролировать следующим образом:
- хранение значений полей непосредственно (
map) - хранение порядковых номеров поля, определенных индексом Lucene (
global_ordinals) - хранение хешей значений поля — с потенциальными коллизиями хешей (
bytes_hash)
Значение по умолчанию — использовать global_ordinals, если эта информация доступна из индекса Lucene, и возвращаться к map, если нет. Настройка bytes_hash может оказаться быстрее в некоторых случаях, но вводит возможность ложных срабатываний в логике дедупликации из-за возможности коллизий хешей. Обратите внимание, что Elasticsearch проигнорирует выбранный параметр execution_hint, если он не применим, и нет гарантии обратной совместимости с этими подсказками.
Ограничения
Не может быть вложен в агрегации breadth_first
В качестве фильтра, основанного на качестве, агрегирование diversified_sampler нуждается в доступе к оценке релевантности, вычисляемой для каждого документа. Поэтому оно не может быть вложено в агрегирование terms, у которого переключён параметр collect_mode из режима по умолчанию depth_first в breadth_first, так как это отбрасывает оценки. В этом случае будет выдана ошибка.
Ограниченная логика дедупликации.
Логика дедупликации применяется только на уровне фрагмента, поэтому не распространяется на другие фрагменты.
Отсутствие специализированной синтаксической конструкции для гео/датовых полей
В настоящее время синтаксис для определения значений диверсификации определяется выбором field или script — нет дополнительного синтаксического сахара для выражения гео или датовых единиц, таких как «7d» (7 дней). Эта поддержка может быть добавлена в будущих версиях, и пользователям сейчас необходимо создавать такие значения с помощью скрипта.
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/search-aggregations-bucket-diversified-sampler-aggregation.html