Числовые типы полей
Поддерживаются следующие числовые типы:
| | Целое 64-битное со знаком с минимальным значением |
| | Целое 32-битное со знаком с минимальным значением |
| | Целое 16-битное со знаком с минимальным значением |
| | Целое 8-битное со знаком с минимальным значением |
| | Вещественное число двойной точности 64 бита IEEE 754, ограниченное конечными значениями. |
| | Вещественное число одинарной точности 32 бита IEEE 754, ограниченное конечными значениями. |
| | Вещественное число полуточной точности 16 бит IEEE 754, ограниченное конечными значениями. |
| | Вещественное число, основанное на |
| | Целое 64-битное без знака с минимальным значением 0 и максимальным значением |
Ниже приведен пример конфигурации отображения с числовыми полями:
resp = client.indices.create(
index="my-index-000001",
mappings={
"properties": {
"number_of_bytes": {
"type": "integer"
},
"time_in_seconds": {
"type": "float"
},
"price": {
"type": "scaled_float",
"scaling_factor": 100
}
}
},
)
print(resp) response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
properties: {
number_of_bytes: {
type: 'integer'
},
time_in_seconds: {
type: 'float'
},
price: {
type: 'scaled_float',
scaling_factor: 100
}
}
}
}
)
puts response res, err := es.Indices.Create(
"my-index-000001",
es.Indices.Create.WithBody(strings.NewReader(`{
"mappings": {
"properties": {
"number_of_bytes": {
"type": "integer"
},
"time_in_seconds": {
"type": "float"
},
"price": {
"type": "scaled_float",
"scaling_factor": 100
}
}
}
}`)),
)
fmt.Println(res, err) const response = await client.indices.create({
index: "my-index-000001",
mappings: {
properties: {
number_of_bytes: {
type: "integer",
},
time_in_seconds: {
type: "float",
},
price: {
type: "scaled_float",
scaling_factor: 100,
},
},
},
});
console.log(response); PUT my-index-000001
{
"mappings": {
"properties": {
"number_of_bytes": {
"type": "integer"
},
"time_in_seconds": {
"type": "float"
},
"price": {
"type": "scaled_float",
"scaling_factor": 100
}
}
}
} Типы double, float и half_float учитывают, что -0.0 и +0.0 — это разные значения. Вследствие этого, запрос term на -0.0 не будет соответствовать +0.0 и наоборот. То же самое верно для запросов по диапазону: если верхняя граница равна -0.0, то +0.0 не будет соответствовать, а если нижняя граница равна +0.0, то -0.0 не будет соответствовать.
Какой тип следует использовать?
Что касается целочисленных типов (byte, short, integer и long), вы должны выбрать наименьший тип, который достаточно для вашего случая использования. Это поможет сделать индексирование и поиск более эффективными. Обратите внимание, что хранение оптимизировано на основе фактических хранимых значений, поэтому выбор одного типа вместо другого не повлияет на требования к хранению.
Для типов с плавающей запятой часто более эффективно хранить данные с плавающей запятой в виде целых чисел с помощью коэффициента масштабирования, что и делает тип scaled_float под капотом. Например, поле price можно хранить в поле типа scaled_float с коэффициентом масштабирования scaling_factor равным 100. Все API будут работать так, как если бы поле хранилось как double, но под капотом Elasticsearch будет работать с количеством центов, price*100, которое является целым числом. Это в основном помогает экономить дисковое пространство, так как целые числа гораздо легче сжимаются, чем числа с плавающей запятой. scaled_float также хорошо использовать, чтобы пожертвовать точностью ради места на диске. Например, представьте, что вы отслеживаете использование ЦП как число между 0 и 1. Обычно не имеет большого значения, является ли использование ЦП 12.7% или 13%, поэтому можно использовать scaled_float с коэффициентом масштабирования scaling_factor равным 100, чтобы округлить использование ЦП до ближайшего процента, чтобы сэкономить место.
Если scaled_float не подходит, то следует выбрать наименьший тип, который достаточно для данного случая использования, среди типов с плавающей запятой: double, float и half_float. Вот таблица, которая сравнивает эти типы, чтобы помочь принять решение.
| Тип | Минимальное значение | Максимальное значение | Значимые биты / цифры | Пример потери точности |
|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Отображение числовых идентификаторов
Не все числовые данные следует отображать как числовой тип данных. Elasticsearch оптимизирует числовые поля, такие как integer или long, для запросов по диапазону. Однако, поля типа keyword лучше подходят для запросов по терму и других запросов на уровне терминов.
Идентификаторы, такие как ISBN или идентификатор продукта, редко используются в запросах по диапазону. Однако они часто извлекаются с помощью запросов на уровне терминов.
Рассмотрите отображение числового идентификатора как keyword, если:
- Вы не планируете искать идентификаторы с помощью запросов по диапазону.
- Важно быстрое извлечение. Запросы по терму на полях типа
keywordчасто быстрее, чем запросы по числовым полям.
Если вы не уверены, какой тип использовать, можно использовать многопольное отображение, чтобы отобразить данные как keyword и как числовой тип данных.
Параметры для числовых полей
Следующие параметры принимаются числовыми типами:
-
coerce - Попытка преобразовать строки в числа и обрезать дроби для целых чисел. Принимает
true(по умолчанию) иfalse. Не применимо кunsigned_long. Обратите внимание, что это нельзя установить, если используется параметрscript. -
doc_values - Необходимо ли хранить поле на диске в виде столбцовой структуры, чтобы его можно было использовать для сортировки, агрегаций или сценариев? Принимает
true(по умолчанию) илиfalse. -
ignore_malformed - Если
true, некорректные числа игнорируются. Еслиfalse(по умолчанию), некорректные числа вызывают исключение и отклоняют весь документ. Обратите внимание, что это нельзя установить, если используется параметрscript. -
index - Необходимо ли быстро находить поле по запросу? Принимает
true(по умолчанию) иfalse. Числовые поля, для которых включен только параметрdoc_values, также могут быть запрошены, хотя и медленнее. -
meta - Метаданные о поле.
-
null_value - Принимает числовое значение того же
typeтипа, что и поле, которое используется для подстановки явныхnullзначений. По умолчаниюnull, что означает, что поле считается отсутствующим. Обратите внимание, что это нельзя установить, если используется параметрscript. -
on_script_error - Определяет, что делать, если сценарий, определенный параметром
script, генерирует ошибку во время индексирования. Принимаетfail(по умолчанию), что приведет к отклонению всего документа, иcontinue, что добавит поле в метаданные документа в поле_ignoredи продолжит индексирование. Этот параметр можно установить только в том случае, если также установлен параметрscript. -
script - Если этот параметр установлен, поле будет индексировать значения, генерируемые этим скриптом, а не читать значения напрямую из источника. Если для этого поля в документе задано значение, документ будет отклонен с ошибкой. Скрипты имеют тот же формат, что и их эквиваленты runtime. Скрипты могут быть настроены только для полей типов
longиdouble. -
store - Необходимо ли хранить значение поля отдельно от поля
_source. Принимаетtrueилиfalse(по умолчанию). -
time_series_dimension -
(Необязательно, булево)
Помечает поле как измерение временного ряда. По умолчанию
false.index.mapping.dimension_fields.limitпараметр настройки индекса ограничивает количество измерений в индексе.Поля измерений имеют следующие ограничения:
- Параметры отображения
doc_valuesиindexдолжны бытьtrue.
Из числовых типов полей только поля
byte,short,integer,longиunsigned_longподдерживают этот параметр.Числовое поле не может быть одновременно измерением временного ряда и метрикой временного ряда.
- Параметры отображения
-
time_series_metric -
(Необязательно, строка) Помечает поле как метрику временного ряда. Значение — тип метрики. Вы не можете обновить этот параметр для существующих полей.
Допустимые
time_series_metricзначения для числовых полей-
counter - Кумулятивная метрика, которая только монотонно увеличивается или сбрасывается до
0(ноль). Например, количество ошибок или завершенных задач. -
gauge - Метрика, представляющая единственное число, которое может произвольно увеличиваться или уменьшаться. Например, температура или доступное дисковое пространство.
-
null(По умолчанию) - Не является метрикой временного ряда.
Для числовой метрики временного ряда параметр
doc_valuesдолжен бытьtrue. Числовое поле не может быть одновременно измерением временного ряда и метрикой временного ряда. -
Параметры для scaled_float
scaled_float принимает дополнительный параметр:
| | Множитель масштабирования, используемый при кодировании значений. Значения будут умножаться на этот множитель во время индексирования и округляться до ближайшего целого значения long. Например, поле |
scaled_float насыщение
scaled_float хранится как одно long значение, которое является произведением исходного значения и множителя масштабирования. Если результат умножения выходит за пределы диапазона long, значение насыщается до минимального или максимального значения long. Например, если множитель масштабирования равен 100, а значение равно 92233720368547758.08, ожидаемое значение равно 9223372036854775808. Однако хранимое значение равно 9223372036854775807, максимальному значению для long.
Это может привести к непредвиденным результатам при использовании запросов с диапазонами диапазоном, когда множитель масштабирования или предоставленное значение float являются чрезвычайно большими.
Синтетические _source
Синтетические _source доступны только для индексов TSDB (индексы, для которых index.mode установлено в time_series). Для других индексов синтетические _source находятся в техническом превью. Функции в техническом превью могут быть изменены или удалены в будущих выпусках. Elastic будет работать над исправлением любых проблем, но функции в техническом превью не подпадают под SLA поддержки официальных функций GA.
Все числовые поля поддерживают синтетические _source в их конфигурации по умолчанию. Синтетические _source нельзя использовать вместе с copy_to или с отключенным doc_values.
Синтетический источник может сортировать числовые значения поля. Например:
resp = client.indices.create(
index="idx",
settings={
"index": {
"mapping": {
"source": {
"mode": "synthetic"
}
}
}
},
mappings={
"properties": {
"long": {
"type": "long"
}
}
},
)
print(resp)
resp1 = client.index(
index="idx",
id="1",
document={
"long": [
0,
0,
-123466,
87612
]
},
)
print(resp1) const response = await client.indices.create({
index: "idx",
settings: {
index: {
mapping: {
source: {
mode: "synthetic",
},
},
},
},
mappings: {
properties: {
long: {
type: "long",
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "idx",
id: 1,
document: {
long: [0, 0, -123466, 87612],
},
});
console.log(response1); PUT idx
{
"settings": {
"index": {
"mapping": {
"source": {
"mode": "synthetic"
}
}
}
},
"mappings": {
"properties": {
"long": { "type": "long" }
}
}
}
PUT idx/_doc/1
{
"long": [0, 0, -123466, 87612]
} Превратится в:
{
"long": [-123466, 0, 0, 87612]
} Масштабированные числа с плавающей точкой всегда применяют свой множитель масштабирования, поэтому:
resp = client.indices.create(
index="idx",
settings={
"index": {
"mapping": {
"source": {
"mode": "synthetic"
}
}
}
},
mappings={
"properties": {
"f": {
"type": "scaled_float",
"scaling_factor": 0.01
}
}
},
)
print(resp)
resp1 = client.index(
index="idx",
id="1",
document={
"f": 123
},
)
print(resp1) const response = await client.indices.create({
index: "idx",
settings: {
index: {
mapping: {
source: {
mode: "synthetic",
},
},
},
},
mappings: {
properties: {
f: {
type: "scaled_float",
scaling_factor: 0.01,
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "idx",
id: 1,
document: {
f: 123,
},
});
console.log(response1); PUT idx
{
"settings": {
"index": {
"mapping": {
"source": {
"mode": "synthetic"
}
}
}
},
"mappings": {
"properties": {
"f": { "type": "scaled_float", "scaling_factor": 0.01 }
}
}
}
PUT idx/_doc/1
{
"f": 123
} Превратится в:
{
"f": 100.0
}
© 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/number.html