Spec-Zone.ru › Elasticsearch 7
›Elasticsearch Guide [7.17] ›Агрегации ›Метрические агрегации

Агрегация Boxplot

Метрическая агрегация, которая вычисляет диаграмму размаха числовых значений, извлеченных из агрегированных документов. Эти значения могут быть сгенерированы из конкретных числовых или полей гистограмм в документах.

Агрегация boxplot возвращает необходимую информацию для построения диаграммы размаха: минимальные, максимальные медианные, первый квартиль (25-й перцентиль) и третий квартиль (75-й перцентиль) значения.

Синтаксис

Агрегация boxplot выглядит следующим образом:

{
  "boxplot": {
    "field": "load_time"
  }
}

Давайте рассмотрим диаграмму размаха, представляющую время загрузки:

GET latency/_search
{
  "size": 0,
  "aggs": {
    "load_time_boxplot": {
      "boxplot": {
        "field": "load_time" 
      }
    }
  }
}

Поле load_time должно быть числовым полем

Ответ будет выглядеть так:

{
  ...

 "aggregations": {
    "load_time_boxplot": {
      "min": 0.0,
      "max": 990.0,
      "q1": 165.0,
      "q2": 445.0,
      "q3": 725.0,
      "lower": 0.0,
      "upper": 990.0
    }
  }
}

В этом случае значения нижней и верхней «усов» равны мин и макс. В общем случае эти значения представляют собой диапазон 1.5 * IQR, то есть ближайшие значения к q1 - (1.5 * IQR) и q3 + (1.5 * IQR). Поскольку это приближение, заданные значения могут не быть фактическими значениями из данных, но должны находиться в пределах разумной погрешности от них. Хотя агрегация Boxplot не возвращает непосредственно выбросы, вы можете проверить, есть ли lower > min или upper < max, чтобы увидеть, существуют ли выбросы с обеих сторон, а затем запросить их напрямую.

Скрипт

Если вам нужно создать диаграмму размаха для значений, которые не индексируются точно, вы должны создать динамическое поле и получить диаграмму размаха этого поля. Например, если ваше время загрузки измеряется в миллисекундах, но вы хотите вычислить значения в секундах, используйте динамическое поле для их преобразования:

GET latency/_search
{
  "size": 0,
  "runtime_mappings": {
    "load_time.seconds": {
      "type": "long",
      "script": {
        "source": "emit(doc['load_time'].value / params.timeUnit)",
        "params": {
          "timeUnit": 1000
        }
      }
    }
  },
  "aggs": {
    "load_time_boxplot": {
      "boxplot": { "field": "load_time.seconds" }
    }
  }
}

Значения Boxplot (обычно) приблизительны

Алгоритм, используемый метрикой boxplot, называется TDigest (представленный Тедом Даннингом в Вычисление точных квантилей с помощью T-Digests).

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

Сжатие

Приближенные алгоритмы должны балансировать использование памяти с точностью оценки. Этот баланс можно контролировать с помощью параметра compression:

GET latency/_search
{
  "size": 0,
  "aggs": {
    "load_time_boxplot": {
      "boxplot": {
        "field": "load_time",
        "compression": 200    
      }
    }
  }
}

Сжатие контролирует использование памяти и погрешность приближения

Алгоритм TDigest использует несколько «узлов» для приближения перцентилей — чем больше узлов доступно, тем выше точность (и больший объем памяти), пропорционально объему данных. Параметр compression ограничивает максимальное количество узлов до 20 * compression.

Поэтому, увеличивая значение сжатия, вы можете повысить точность ваших перцентилей за счет большей потребности в памяти. Более высокие значения сжатия также замедляют алгоритм, так как размер подлежащей древовидной структуры увеличивается, что приводит к более дорогим операциям. Значение сжатия по умолчанию — 100.

«Узел» потребляет примерно 32 байта памяти, поэтому в худшем случае (большое количество данных, которые поступают упорядоченно и по порядку) значения по умолчанию приведут к TDigest размером примерно 64 КБ. На практике данные, как правило, более случайные, и TDigest использует меньше памяти.

Пропущенное значение

Параметр missing определяет, как должны обрабатываться документы, у которых отсутствует значение. По умолчанию они игнорируются, но также можно обрабатывать их так, как будто у них есть значение.

GET latency/_search
{
  "size": 0,
  "aggs": {
    "grade_boxplot": {
      "boxplot": {
        "field": "grade",
        "missing": 10     
      }
    }
  }
}

Документы без значения в поле grade попадут в тот же контейнер, что и документы, имеющие значение 10.

© 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-metrics-boxplot-aggregation.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API