Elasticsearch SUM聚合返回double而非long,如何保留精度输出?
解决Elasticsearch SUM聚合LONG字段的格式与精度问题
首先明确:你看到的value: 1.01724077E8只是JSON序列化时的科学计数法显示形式,并没有丢失精度。Elasticsearch对整数类型字段做SUM聚合时,会用64位浮点数(double)存储结果,而double可以精确表示所有2^53以内的整数——只要你的eventSize总和不超过这个范围(约9e15),精度是完全有保障的。
如果你想让返回结果不用科学计数法,同时保留精度,可以用以下两种方法:
方法1:调整format参数的数字格式
把原来的format: "##.00"换成更明确的格式,比如:
"eventSizeAgg": { "sum": { "field": "eventSize", "format": "0.00" } }
或者带千分位的格式:
"format": "#,###.00"
这样value_as_string会输出101724077.00这类常规格式的字符串,而value字段的科学计数法只是JSON的显示方式,实际精度并未丢失。
方法2:用脚本聚合保证精确的长整型结果
如果你的总和可能超过2^53(或者你希望直接返回长整型数值),可以用scripted_metric聚合代替普通sum,手动用长整型累加:
"eventSizeAgg": { "scripted_metric": { "init_script": "state.total = 0L", "map_script": "state.total += doc['eventSize'].value", "combine_script": "return state.total", "reduce_script": "long total = 0; for (s in states) { total += s; } return total" } }
这种方式返回的结果会是精确的长整型数值,不会出现科学计数法,也完全不会丢失精度。
内容的提问来源于stack exchange,提问作者ciufy13
相关产品推荐
相关产品推荐

