
我想要实现什么目标?
我需要将一些事件索引到 Elasticsearch 中。这些事件的格式为 JSON,可以包含大量数字(我处理的特定数据最多为 2^128,但这个问题与每种不适合 64 位(即 elastic 的long
/unsigned_long
类型的宽度)的整数类型相关):
{
[...]
"some_large_number": 123456789012345678901234567890,
[...]
}
什么不起作用?
Elastic 支持任何整数类型
只需使用动态映射或明确将类型设置为任何一种弹性中可用的整数类型将无法索引数据并出现如下错误:
数值(1.2345679e+29)超出长整型范围(-9223372036854775808 - 9223372036854775807)
强制数据string
我不需要在 elastic 中对这些字段进行算术运算,因此不需要数字字段的语义。
这意味着简单地将数据存储为text
( "123456789012345678901234567890"
) 是一种选择。
{
"properties": {
"some_large_number": {
"type": "text"
}
}
}
然而,在将相关字段的映射设置为text
做允许数据被索引,该值为不是正如预期的那样:
相反,它将被转换为科学计数法("1.2345679e+29"
),从而导致信息丢失。
更改生产者端的数据
我无法更改传入的数据,因为我无法控制生产者。
添加另一个进行预处理的工具
虽然这并非完全不可能,但我想避免这种解决方案:
在遥测链中插入一些对数据进行预处理的其他工具(例如,在 JSON 中添加引号)肯定可以解决这个问题,但对于这个看似很小的问题来说,这似乎有点小题大做,我希望 Elastic 本身应该有一个简单的解决方案。