ElasticSearch分组后根据sum值排序
2018-04-03 13:06:09
1750 次阅读
0 个评论
ElasticSearch里面的聚合机制非常灵活和强大,今天我们来看下如何在ElasticSearch里面实现分组后,根据sum值进行排序?类似的数据库SQL如下:
然后,我们可以将上面的数据插入到es里面,具体的插入代码不在给出,比较简单,直接通过client.prepareIndex方法插入json即可。
下面看下查询代码:
通过对比,我们可以到到结果是准确的,虽然代码量比sql多很多,但是ElasticSearch的聚合功能却是非常的强大和灵活,用来做一些OLAP分析是非常方便的。
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分析是非常方便的。
相关话题
- 专为无知的你精心熬制的心灵毒鸡汤!毒鸡汤锦集十三
- 直击内心的毒鸡汤,你能喝下几碗?毒鸡汤锦集十
- 品最烈的酒,喝最毒的鸡汤!毒鸡汤锦集一
- 鸡汤使人奋进,毒鸡汤使人愤慨!毒鸡汤锦集二十
- 来来来,干了这碗毒鸡汤!毒鸡汤锦集四
- 灌几口毒鸡汤,用另类的方式获取真正的人生哲理!毒鸡汤锦集六
- 毒鸡汤金句,总有一句戳中你的灵魂!毒鸡汤锦集五
- 如今05后都开始喝毒鸡汤养生了!毒鸡汤锦集十八
- 尝惯了心灵鸡汤,偶尔喝一次毒鸡汤也不错!毒鸡汤锦集十二
- 毒鸡汤大接力,看完后整个人神清气爽!毒鸡汤锦集二十一
- 经典毒鸡汤,句句走心,随你挑选!毒鸡汤锦集二十五
- 毒鸡汤也照三餐喝,再也沒有挑食了!毒鸡汤锦集十七
- 励志就是一碗鸡汤,鸡汤再好喝也是会腻的,有必要来碗毒鸡汤醒醒脑!毒鸡汤锦集二十二
- 喉头蠕动了一下,默默干了这碗毒鸡汤!毒鸡汤锦集二十四
- 史上最毒鸡汤,看完后整个人豁然开朗!毒鸡汤锦集十五