原英文版地址: https://www.elastic.co/guide/en/elasticsearch/reference/7.7/number.html, 原文档版权归 www.elastic.co 所有
本地英文版地址: ../en/number.html

numeric(数值)数据类型

支持以下8种数字类型:

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

半精度32位 IEEE 754 浮点数,仅限于有限值。

scaled_float

一个由long支持的浮点数,按固定的double缩放因子进行缩放。

下面是一个使用 numeric 字段配置映射的示例:

PUT my_index
{
  "mappings": {
    "properties": {
      "number_of_bytes": {
        "type": "integer"
      },
      "time_in_seconds": {
        "type": "float"
      },
      "price": {
        "type": "scaled_float",
        "scaling_factor": 100
      }
    }
  }
}

doublefloathalf_float类型认为-0.0+0.0的值是不同的。 因此,在-0.0上进行term查询将与+0.0不匹配,反之亦然。 对于 range 查询也是一样:如果上限是-0.0,则+0.0将不匹配,如果下限是+0.0,则-0.0将不匹配。

应该使用哪一种类型?

就整数类型(byteshortintegerlong)而言,应该选择满足用例的最小类型。 这将有助于提高编制索引和搜索的效率。 但是请注意,存储是基于存储的实际值进行优化的,因此选择一种类型而不是另一种类型不会影响存储需求。

对于浮点类型,使用缩放因子将浮点数据存储到整数中通常更有效,这就是scaled_float类型在底层所做的。 例如,price字段可以存储在scaling_factor值为100scaled_float中。 所有api的工作原理都是将字段存储为一个 double 类型,但实际上 Elasticsearch 的工作原理是使用一个美分的数值,price*100,这是一个整数。 这对于节省磁盘空间很有帮助,因为整数比浮点更容易压缩。 scaled_float也可以用来以精度换取磁盘空间。 例如,假设你正在跟踪一个01之间的数字的 cpu 利用率。 cpu 利用率是12.7%还是13%通常没有多大关系,因此可以使用scaling_factor 值为100scaled_float,以便将 cpu 利用率四舍五入到最接近的百分比,从而节省空间。

如果scaled_float不是一个很好的选择,那么ni 应该在浮点类型(doublefloathalf_float)中选择一个对用例来说足够的最小类型。 下面这个表格对这些类型进行了比较,以帮助你做出决定。

类型 最小值 最大值 有效位数/数字

double

2-1074

(2-2-52)·21023

53 / 15.95

float

2-149

(2-2-23)·2127

24 / 7.22

half_float

2-24

65504

11 / 3.31

映射数值型标识

并非所有数值数据都应映射为数值型字段数据类型。 Elasticsearch 为范围(range)查询优化数值型字段,如integerlong。 但是,keyword字段更适合于term和其他词级查询。

标识(identifier),如 ISBN 或产品ID,很少在范围(range)查询中使用。 但是,通常使用词级查询来检索它们。

在以下情况下,考虑将数值型标识映射为keyword

  • 你不打算使用range查询来搜索标识数据。
  • 快速检索很重要。 keyword字段上的term查询搜索通常比数值型字段上的term搜索更快。

如果你不确定应该使用哪一种,可以使用多字段(multi-field)将数据映射为keyword数值型数据类型。

数值字段的参数

数值类型接受以下参数:

coerce

尝试将字符串转换为数字,并截断整数的小数部分。接受true (默认) 和false

boost

映射字段级查询时提升。接受浮点数,默认值为1.0

doc_values

是否应该以列跨度(column-stride)的方式将字段存储在磁盘上,以便以后用于排序、聚合或编写脚本? 接受true(默认) 或false

ignore_malformed

如果为true,则忽略格式错误的数字。 如果为false(默认值),格式错误的数字会抛出异常并拒绝整个文档。

index

该字段应该是可搜索的吗?接受true (默认) 和 false

null_value

接受与字段type相同的数值,用于替换任何显式null值。 默认值为null,这意味着该字段被视为缺失。

store

字段值是否应该与_source字段分开存储和检索。 接受truefalse (默认)。

meta

字段的元数据。

scaled_float的参数

scaled_float接受一个额外的参数:

scaling_factor

对值进行编码时使用的缩放因子。 值将在编制索引时乘以该因子,并舍入到最接近的长整型(long)值。 例如,scaled_floatscaling_factor10,它会在内部将2.34存储为23,所有搜索时操作(查询、聚合、排序)都将表现为文档的值为2.3。 较高的scaling_factor值提高了精度,但也增加了空间需求。 此参数是必需的。