es对分组后结果进行统计_ElasticSearch里面如何分组后根据sum值排序
ElasticSearch里面的聚合機制非常靈活和強大,今天我們來看下如何在ElasticSearch里面實現分組后,根據sum值進行排序?類似的數據庫SQL如下:
select id,sum(c1) as c1 , sum(c2) as c2 from table1 group id order by c1 desc, c2 asc
這是一個比較常見的統計需求,在es也能比較輕松的實現,先看看curl的一個實現例子查詢:
GET myindex/_search
{
"size":0,
"aggs": {
"a1": {
"terms": {
"field": "FIELD1",
"size":0,
"order": {"a2": "desc"}
},
"aggs":{
"a2":{
"sum":{
"field":"FIELD2.SUBFIELD"
}
}
}
}
}
}
然后,我們看下,如何在Java Api里面操作:
首先我們看下造的數據
總共三個字段id,count,code都是int類型的
id,count,code
1,3,1
2,4,1
1,5,2
2,7,1
3,11,7
然后,我們可以將上面的數據插入到es里面,具體的插入代碼不在給出,比較簡單,直接通過client.prepareIndex方法插入json即可。
下面看下查詢代碼:
public void groupTest(){
//構建查詢請求體
SearchRequestBuilder search = client.prepareSearch("gv_test").setTypes("gv_test");
//分組字段是id,排序由多個字段排序組成
TermsBuilder tb= AggregationBuilders.terms("id").field("id").order(Terms.Order.compound(
Terms.Order.aggregation("sum_count",false)//先按count,降序排
,
Terms.Order.aggregation("sum_code",true)//如果count相等情況下,使用code的和排序
));
//求和字段1
SumBuilder sb= AggregationBuilders.sum("sum_count").field("count");
//求和字段2
SumBuilder sb_code= AggregationBuilders.sum("sum_code").field("code");
tb.subAggregation(sb);//添加到分組聚合請求中
tb.subAggregation(sb_code);//添加到分組聚合請求中
//將分組聚合請求插入到主請求體重
search.addAggregation(tb);
//發送查詢,獲取聚合結果
Terms tms= search.get().getAggregations().get("id");
//遍歷每一個分組的key
for(Terms.Bucket tbb:tms.getBuckets()){
//獲取count的和
Sum sum= tbb.getAggregations().get("sum_count");
//獲取code的和
Sum sum2=tbb.getAggregations().get("sum_code");
System.out.println(tbb.getKey()+" " + tbb.getDocCount() +" "+sum.getValue()+" "+sum2.getValue());
}
//釋放資源
client.close();
}
最終的結果如下:
id,分組個數,count的和,code和
2 2 11.0 2.0
3 1 11.0 7.0
1 2 8.0 3.0
通過對比,我們可以到到結果是準確的,雖然代碼量比sql多很多,但是ElasticSearch的聚合功能卻是非常的強大和靈活,用來做一些OLAP分析是非常方便的。
有什么問題可以掃碼關注微信公眾號:我是攻城師(woshigcs),在后臺留言咨詢。 技術債不能欠,健康債更不能欠, 求道之路,與君同行。
總結
以上是生活随笔為你收集整理的es对分组后结果进行统计_ElasticSearch里面如何分组后根据sum值排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: post提交调用的却是doget方法_P
- 下一篇: 单元格内多个姓名拆分成一列_excel单