Агрегация гистограммы с переменной шириной
Это агрегация с несколькими объёмами, похожая на гистограмму. Однако ширина каждого объёма не задаётся. Вместо этого предоставляется целевое количество объёмов, а интервалы объёмов динамически определяются на основе распределения документов. Это выполняется с помощью простого алгоритма кластеризации документов за один проход, который направлен на получение малых расстояний между центрами объёмов. В отличие от других агрегаций с несколькими объёмами, интервалы не обязательно будут иметь равную ширину.
Количество возвращаемых объёмов всегда будет меньше или равно целевому количеству.
Запрос целевого значения 2 объёма.
resp = client.search(
index="sales",
size="0",
aggs={
"prices": {
"variable_width_histogram": {
"field": "price",
"buckets": 2
}
}
},
)
print(resp) response = client.search(
index: 'sales',
size: 0,
body: {
aggregations: {
prices: {
variable_width_histogram: {
field: 'price',
buckets: 2
}
}
}
}
)
puts response const response = await client.search({
index: "sales",
size: 0,
aggs: {
prices: {
variable_width_histogram: {
field: "price",
buckets: 2,
},
},
},
});
console.log(response); 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/8.17/search-aggregations-bucket-variablewidthhistogram-aggregation.html