Тип поля Гистограмма
Поле для хранения предварительно агрегированных числовых данных, представляющих гистограмму. Эти данные определяются с использованием двух пар массивов:
Поскольку элементы в массиве values соответствуют элементам в том же положении массива count, эти два массива должны иметь одинаковую длину.
- Поле
histogramможет хранить только одну пару массивовvaluesиcountна документ. Вложенные массивы не поддерживаются. - Поля
histogramне поддерживают сортировку.
Применение
Поля histogram предназначены в первую очередь для использования с агрегациями. Для более удобного доступа к агрегациям данные поля histogram хранятся как двоичные значения документа и не индексируются. Его размер в байтах не превышает 13 * numValues, где numValues - длина предоставленных массивов.
Поскольку данные не индексируются, вы можете использовать поля histogram только для следующих агрегаций и запросов:
- агрегация min
- агрегация max
- агрегация sum
- агрегация value_count
- агрегация avg
- агрегация процентилей
- агрегация рангов процентилей
- агрегация боксплотов
- агрегация гистограммы
- агрегация диапазона
- запрос существования
Создание гистограммы
При использовании гистограммы в качестве части агрегации точность результатов будет зависеть от того, как была построена гистограмма. Важно учитывать режим агрегации процентилей, который будет использоваться для ее построения. Некоторые варианты включают:
- Для режима T-Digest массив
valuesпредставляет средние позиции центроидов, а массивcountsпредставляет количество значений, приписываемых каждому центроиду. Если алгоритм уже начал приближать процентили, эта неточность переносится в гистограмму. - Для режима гистограммы с высоким динамическим диапазоном (HDR) массив
valuesпредставляет фиксированные верхние пределы каждого интервала корзины, а массивcountsпредставляет количество значений, приписываемых каждому интервалу. Эта реализация поддерживает фиксированную процентную ошибку в худшем случае (указанную как количество значащих цифр), поэтому значение, используемое при построении гистограммы, будет максимальной точностью, которую можно достичь во время агрегации.
Поле гистограммы «алгоритмически независимо» и не хранит данные, специфичные ни для T-Digest, ни для HDRHistogram. Хотя это означает, что поле теоретически можно агрегировать с помощью любого из алгоритмов, на практике пользователь должен выбрать один алгоритм и индексировать данные таким образом (например, центроиды для T-Digest или интервалы для HDRHistogram), чтобы обеспечить наилучшую точность.
Синтетическое _source
Синтетическое _source доступно в режиме General Availability только для индексов TSDB (индексов, для которых index.mode установлено в значение time_series). Для других индексов синтетическое _source находится на стадии технического предварительного просмотра. Функции, находящиеся на стадии технического предварительного просмотра, могут быть изменены или удалены в будущих выпусках. Elastic будет работать над устранением любых проблем, но функции на стадии технического предварительного просмотра не подпадают под SLA поддержки официальных функций GA.
Поля histogram поддерживают синтетическое _source в их стандартной конфигурации.
Для экономии места корзины с нулевым количеством значений не хранятся в значениях документа гистограммы. В результате, при индексировании поля гистограммы в индексе с включенным синтетическим источником, индексирование гистограммы, включающей корзины с нулевым количеством значений, приведет к отсутствию корзин при получении гистограммы.
Примеры
Следующий запрос API создания индекса создает новый индекс с двумя отображениями полей:
-
my_histogram, полеhistogram, используемое для хранения данных процентилей -
my_text, полеkeyword, используемое для хранения заголовка гистограммы
resp = client.indices.create(
index="my-index-000001",
mappings={
"properties": {
"my_histogram": {
"type": "histogram"
},
"my_text": {
"type": "keyword"
}
}
},
)
print(resp) response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
properties: {
my_histogram: {
type: 'histogram'
},
my_text: {
type: 'keyword'
}
}
}
}
)
puts response const response = await client.indices.create({
index: "my-index-000001",
mappings: {
properties: {
my_histogram: {
type: "histogram",
},
my_text: {
type: "keyword",
},
},
},
});
console.log(response); PUT my-index-000001
{
"mappings" : {
"properties" : {
"my_histogram" : {
"type" : "histogram"
},
"my_text" : {
"type" : "keyword"
}
}
}
} Следующие запросы API индексирования хранят предварительно агрегированные данные для двух гистограмм: histogram_1 и histogram_2.
resp = client.index(
index="my-index-000001",
id="1",
document={
"my_text": "histogram_1",
"my_histogram": {
"values": [
0.1,
0.2,
0.3,
0.4,
0.5
],
"counts": [
3,
7,
23,
12,
6
]
}
},
)
print(resp)
resp1 = client.index(
index="my-index-000001",
id="2",
document={
"my_text": "histogram_2",
"my_histogram": {
"values": [
0.1,
0.25,
0.35,
0.4,
0.45,
0.5
],
"counts": [
8,
17,
8,
7,
6,
2
]
}
},
)
print(resp1) response = client.index(
index: 'my-index-000001',
id: 1,
body: {
my_text: 'histogram_1',
my_histogram: {
values: [
0.1,
0.2,
0.3,
0.4,
0.5
],
counts: [
3,
7,
23,
12,
6
]
}
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 2,
body: {
my_text: 'histogram_2',
my_histogram: {
values: [
0.1,
0.25,
0.35,
0.4,
0.45,
0.5
],
counts: [
8,
17,
8,
7,
6,
2
]
}
}
)
puts response const response = await client.index({
index: "my-index-000001",
id: 1,
document: {
my_text: "histogram_1",
my_histogram: {
values: [0.1, 0.2, 0.3, 0.4, 0.5],
counts: [3, 7, 23, 12, 6],
},
},
});
console.log(response);
const response1 = await client.index({
index: "my-index-000001",
id: 2,
document: {
my_text: "histogram_2",
my_histogram: {
values: [0.1, 0.25, 0.35, 0.4, 0.45, 0.5],
counts: [8, 17, 8, 7, 6, 2],
},
},
});
console.log(response1); PUT my-index-000001/_doc/1
{
"my_text" : "histogram_1",
"my_histogram" : {
"values" : [0.1, 0.2, 0.3, 0.4, 0.5],
"counts" : [3, 7, 23, 12, 6]
}
}
PUT my-index-000001/_doc/2
{
"my_text" : "histogram_2",
"my_histogram" : {
"values" : [0.1, 0.25, 0.35, 0.4, 0.45, 0.5],
"counts" : [8, 17, 8, 7, 6, 2]
}
} | Значения для каждой корзины. Значения в массиве обрабатываются как числа с плавающей точкой и должны быть указаны в порядке возрастания. Для гистограмм T-Digest это значение представляет среднее значение. В случае гистограмм HDR это значение представляет значение, к которому происходит итерация. | |
| Количество для каждой корзины. Значения в массивах обрабатываются как целые числа типа long и должны быть положительными или нулевыми. Отрицательные значения будут отклонены. Связь между корзиной и количеством определяется положением в массиве. |
© 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/histogram.html