如何在指定时间区间内对Elasticsearch文档的大小求和?
解决Elasticsearch指定时间区间内文档大小求和的问题
你的聚合结果为0是因为错误使用了doc['_source'].bytes作为sum聚合的字段引用方式,Elasticsearch无法通过这种方式正确读取字段值。以下是正确的实现方式:
正确查询(数值类型字段)
如果bytes字段在索引中是数值类型(如long、double),直接指定字段名即可:
GET /events/_search { "query": { "bool": { "must": [ {"range": {"ts": {"gte": "2022-10-10T00:00:00Z", "lt": "2022-10-21T00:00:00Z"}}} ] } }, "aggs": { "total_size": { "sum": { "field": "bytes" } } }, "size": 0 // 仅返回聚合结果,不返回匹配文档,提升查询性能 }
处理字符串类型的bytes字段
如果bytes字段是字符串类型,需要通过脚本将其转为数值后再求和:
GET /events/_search { "query": { "bool": { "must": [ {"range": {"ts": {"gte": "2022-10-10T00:00:00Z", "lt": "2022-10-21T00:00:00Z"}}} ] } }, "aggs": { "total_size": { "sum": { "script": { "source": "doc['bytes'].value != null ? Double.parseDouble(doc['bytes'].value) : 0" } } } }, "size": 0 }
注意:脚本转换会降低查询性能,建议在索引文档时就将
bytes字段设置为数值类型,从根源上避免这类问题。
内容的提问来源于stack exchange,提问作者blue-sky
相关产品推荐
相关产品推荐

