如何用ElasticSearch存储大数?区块链Wei值存储方案咨询
Elasticsearch存储区块链Wei值的大整数问题解决方案
关于大数/Decimal类型支持
Elasticsearch没有原生的Decimal类型,也没有直接支持超出long(范围:-9223372036854775808 到 9223372036854775807)范围的整数类型。不过针对区块链Wei这类超大整数,有几种无精度损失的处理方案:
1. 字符串存储
直接将Wei值以字符串类型存入Elasticsearch:
- 优点:完全保留精度,实现简单,无需额外转换逻辑。
- 缺点:无法直接对该字段执行数值运算、范围查询(如大于/小于比较),若需此类操作需借助脚本实现,但会显著降低查询性能。适合仅需存储和精确匹配的场景。
2. 二进制存储
将大整数转换为二进制字节数组,使用Elasticsearch的binary类型存储:
- 优点:完整保留精度,存储空间比字符串更紧凑。
- 缺点:查询时需要在应用层自行解码,无法直接进行数值相关操作,仅适合纯存储和精确读取的场景。
3. 拆分多字段存储
将超大整数按64位拆分,分成多个long类型字段(如wei_high、wei_low)存储:
- 实现方式:比如将256位的Wei值拆分为4个64位字段,存入时按位拆分,查询时通过自定义脚本组合字段进行数值比较。
- 优点:支持范围查询等数值操作,精度无损失。
- 缺点:实现复杂度高,查询时脚本会增加性能开销,仅适合必须进行数值运算的场景。
4. 应用层单位转换处理
在存入Elasticsearch前,将Wei值转换为更小的业务单位(如以太,1 ETH = 1e18 Wei),使用double或scaled_float类型存储:
- 注意:此方式仅适用于业务允许转换单位的场景,若必须保留原始Wei值的精确存储,则不适用。
总结
如果不需要对Wei值进行数值运算,字符串存储是最简便的方案;若需数值操作,可考虑拆分多字段存储(需接受性能损耗),或在应用层提前处理单位转换(业务允许的前提下)。
内容的提问来源于stack exchange,提问作者Tho Bui Ngoc
相关产品推荐
相关产品推荐

