Scala中Elasticsearch Sum聚合取值问题:无法获取实际数值总和
解决Scala Elasticsearch聚合获取总和数值的问题
你遇到的问题是因为get("sum_salary_aggregation")返回的是通用的Aggregation类型,并没有直接暴露获取数值的方法,得先把它强转为对应的具体聚合实现类,才能拿到实际的总和。
给你几种可行的修改方式:
方式一:直接强制类型转换
先导入对应的类,再把聚合结果转成InternalSum,调用getValue()就能拿到数值了:
import org.elasticsearch.search.aggregations.metrics.sum.InternalSum val sumSalary = client.execute { search("myindex") aggregations sumAgg("sum_salary_aggregation", "salary") size 0 } sumSalary.map { f => val sumAgg = f.original.getAggregations.get("sum_salary_aggregation").asInstanceOf[InternalSum] println(sumAgg.getValue()) }
方式二:安全类型转换(推荐)
用safeAs方法做类型转换,能避免强制转换可能抛出的异常,更稳妥:
import org.elasticsearch.search.aggregations.metrics.sum.InternalSum val sumSalary = client.execute { search("myindex") aggregations sumAgg("sum_salary_aggregation", "salary") size 0 } sumSalary.map { f => f.original.getAggregations.get("sum_salary_aggregation").safeAs[InternalSum] match { case Some(sumAgg) => println(sumAgg.getValue()) case None => println("聚合结果不存在或类型不匹配") } }
简单说下原理:InternalSum是Elasticsearch中sum聚合的具体实现类,它专门提供了getValue()方法来返回计算后的总和数值;而你之前直接拿到的是父类Aggregation对象,自然没有这个方法,所以必须转成子类才能调用。
内容的提问来源于stack exchange,提问作者Navin Gelot
相关产品推荐
相关产品推荐

