Агрегирование гистограммы с переменной шириной
Это агрегирование по нескольким корзинам, аналогичное гистограмме. Однако ширина каждой корзины не задаётся. Вместо этого указывается целевое количество корзин, и интервалы корзин динамически определяются на основе распределения документов. Это выполняется с помощью простого алгоритма кластеризации документов за один проход, целью которого является получение малых расстояний между центрами корзин. В отличие от других агрегирований по нескольким корзинам, интервалы не обязательно будут иметь одинаковую ширину.
Количество возвращённых корзин всегда будет меньше или равно целевому количеству.
Запрос целевого значения в 2 корзины.
POST /sales/_search?size=0
{
"aggs": {
"prices": {
"variable_width_histogram": {
"field": "price",
"buckets": 2
}
}
}
} Ответ:
{
...
"aggregations": {
"prices": {
"buckets": [
{
"min": 10.0,
"key": 30.0,
"max": 50.0,
"doc_count": 2
},
{
"min": 150.0,
"key": 185.0,
"max": 200.0,
"doc_count": 5
}
]
}
}
} В настоящее время это агрегирование нельзя вложить в любое агрегирование, которое собирает данные более чем из одной корзины.
Алгоритм кластеризации
Каждый фрагмент получает первые initial_buffer документов и сохраняет их в памяти. После того, как буфер заполнится, эти документы сортируются и линейно разделяются на 3/4 * shard_size buckets. Затем каждый оставшийся документ либо собирается в ближайшую корзину, либо помещается в новую корзину, если он находится далеко от всех существующих. Максимально создаётся shard_size корзин.
На шаге уменьшения координирующий узел сортирует корзины со всех фрагментов по их центроидам. Затем две корзины с ближайшими центроидами повторяются до тех пор, пока не будет достигнуто целевое количество корзин. Эта процедура слияния представляет собой вид агломеративной иерархической кластеризации.
Фрагмент может вернуть меньше, чем shard_size корзин, но не больше.
Размер фрагмента
Параметр shard_size указывает количество корзин, которые координирующий узел запросит у каждого фрагмента. Более высокое значение shard_size приводит к тому, что каждый фрагмент генерирует более мелкие корзины. Это снижает вероятность перекрытия корзин после шага уменьшения. Увеличение параметра shard_size повысит точность гистограммы, но также сделает вычисление окончательного результата более дорогостоящим, так как на уровне фрагмента придётся управлять большими очередями приоритетов, а передача данных между узлами и клиентом будет больше.
Параметры buckets, shard_size и initial_buffer являются необязательными. По умолчанию установлены значения buckets = 10, shard_size = buckets * 50 и initial_buffer = min(10 * shard_size, 50000).
Начальный буфер
Параметр initial_buffer можно использовать для указания количества отдельных документов, которые будут храниться в памяти на фрагменте, прежде чем будет запущен начальный алгоритм кластеризации. Распределение корзин определяется с помощью этой выборки из initial_buffer документов. Таким образом, хотя более высокое значение initial_buffer потребует больше памяти, оно приведёт к более представительным кластерам.
Границы корзин приблизительны
Во время шага уменьшения главный узел непрерывно объединяет две корзины с ближайшими центрами. Если две корзины имеют перекрывающиеся границы, но удалённые центры, то возможно, что они не будут объединены. Из-за этого после уменьшения максимальное значение в некотором интервале (max) может быть больше, чем минимальное значение в последующей корзине (min). Для уменьшения влияния этой ошибки, при возникновении такого перекрытия граница между этими интервалами корректируется на (max + min) / 2.
Границы корзин очень чувствительны к выбросам
© 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-variablewidthhistogram-aggregation.html