Elasticsearch 6.8.23:聚合字段小数位数设置及全局配置咨询
问题解答
1. 能否仅针对特定字段修改小数位数?
可以,完全可以只针对需要的小数类型字段调整输出位数,不影响Integer、String等其他类型字段。你之前的format参数未生效,是因为参数位置错误——应该把format放在avg聚合的内部,而非外层聚合节点下。
修改后的聚合部分示例:
"aggregations": { "outputCol4": { "avg": { "script": { "source": "doc['col4'].value", "lang": "painless" }, "format": "0.000" } } }
如果上述方式在你的ES 6.8.23版本中仍不生效,可以通过脚本直接对聚合结果做四舍五入处理,比如用bucket_script二次加工:
"aggregations": { "outputCol4_raw": { "avg": { "script": { "source": "doc['col4'].value", "lang": "painless" } } }, "outputCol4": { "bucket_script": { "buckets_path": { "avgVal": "outputCol4_raw" }, "script": "Math.round(params.avgVal * 1000) / 1000.0" } } }
这种方式只会处理outputCol4的结果,其他字段的输出不受影响。
2. Elasticsearch服务层面是否存在可限制输出或存储字段小数位数的属性?
存储层面
可以通过字段映射(Mapping)来限制存储时的小数位数,针对数值字段使用scaled_float类型并设置scaling_factor。比如要让col4保留三位小数,可定义映射:
"col4": { "type": "scaled_float", "scaling_factor": 1000 }
该类型会把数值乘以1000后以整数存储,读取时自动除以1000还原,既节省存储空间又能固定小数位数。注意此设置需在字段创建时定义,无法事后修改。
服务全局层面
没有全局配置参数可以统一限制所有字段的小数输出位数,只能针对单个字段通过映射或查询语句单独处理。
内容的提问来源于stack exchange,提问作者Saif Ahmad
相关产品推荐
相关产品推荐

