Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Руководство [8.17] ›Отображение ›Типы данных полей

Числовые типы полей

Поддерживаются следующие числовые типы:

long

Целое 64-битное со знаком с минимальным значением -263 и максимальным значением 263-1.

integer

Целое 32-битное со знаком с минимальным значением -231 и максимальным значением 231-1.

short

Целое 16-битное со знаком с минимальным значением -32,768 и максимальным значением 32,767.

byte

Целое 8-битное со знаком с минимальным значением -128 и максимальным значением 127.

double

Вещественное число двойной точности 64 бита IEEE 754, ограниченное конечными значениями.

float

Вещественное число одинарной точности 32 бита IEEE 754, ограниченное конечными значениями.

half_float

Вещественное число полуточной точности 16 бит IEEE 754, ограниченное конечными значениями.

scaled_float

Вещественное число, основанное на long, масштабированное с помощью фиксированного double коэффициента масштабирования.

unsigned_long

Целое 64-битное без знака с минимальным значением 0 и максимальным значением 264-1.

Ниже приведен пример конфигурации отображения с числовыми полями:

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. Вот таблица, которая сравнивает эти типы, чтобы помочь принять решение.

Тип Минимальное значение Максимальное значение Значимые
биты / цифры
Пример потери точности

double

2-1074

(2-2-52)·21023

53 / 15.95

1.2345678912345678→
1.234567891234568

float

2-149

(2-2-23)·2127

24 / 7.22

1.23456789→
1.2345679

half_float

2-24

65504

11 / 3.31

1.2345→
1.234375

Отображение числовых идентификаторов

Не все числовые данные следует отображать как числовой тип данных. 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 принимает дополнительный параметр:

scaling_factor

Множитель масштабирования, используемый при кодировании значений. Значения будут умножаться на этот множитель во время индексирования и округляться до ближайшего целого значения long. Например, поле scaled_float со значением scaling_factor 10 будет внутренне хранить 2.34 как 23, и все операции поиска (запросы, агрегации, сортировка) будут вести себя так, как будто в документе было значение 2.3. Высокие значения scaling_factor повышают точность, но также увеличивают требования к пространству. Этот параметр обязателен.

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

Spec-Zone.ru

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