前言

  • 本文在 Elasticsearch 7.17 下测试
  • Elasticsearch 自 7.10 引入了 64 位无符号整数 unsigned_long,之前只有 long
  • 已知 long 的数据范围
[-2^63, 2^63-1]
即
[-9223372036854775808, 9223372036854775807]
  • 已知 unsigned_long 的数据范围
[0, 2^64-1]
即
[0, 18446744073709551615]

试验

  • 创建索引
PUT my_index
{
  "mappings": {
    "dynamic": true,
    "properties": {
      "LLL": {
        "type": "long"
      },
      "UUU": {
        "type": "unsigned_long"
      }
    }
  }
}
  • 测试 LLL 字段,写入数据 18446744073709551615,即 2^64-1
POST /my_index/_doc/1
{
  "LLL": 18446744073709551615,
  "UUU": 18446744073709551615
}

LLL 字段报错如下,超过了 long 能表达的数据范围

Numeric value (18446744073709551615) out of range of 
    long (-9223372036854775808 - 9223372036854775807)
  • 测试 DDD 动态字段,写入数据 18446744073709551615,即 2^64-1
POST /my_index/_doc/1
{
  "UUU": 18446744073709551615,
  "DDD": 18446744073709551615
}

DDD 字段跟前面 LLL 报一样的错误。

  • 测试写入短整数动态字段,III 字段被解析位 long 类型
POST /my_index/_doc/1
{
  "III": 1844
}

小结

  • long 类型存放大于 long 范围的 unsigned_long 会报错。
  • 对于动态字段,ES 会尝试将整数解析为 long 类型,unsigned_long 整数无法被正确解析。
本文出自 qbit snap

qbit
268 声望279 粉丝