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值排序相关推荐

  1. es对分组后结果进行统计_elasticsearch聚合操作——本质就是针对搜索后的结果使用桶bucket(允许嵌套)进行group by,统计下分组结果,包括min/max/avg...

    分析 最后,我们还有一个需求需要完成:允许管理者在职员目录中进行一些分析. Elasticsearch有一个功能叫做聚合(aggregations),它允许你在数据上生成复杂的分析统计.它很像SQL中 ...

  2. collectors 求和_Collectors.groupingBy() 分组、求和、统计、平均、最大(小)值

    public classgroupingBy {public static voidmain(String[]args) {ArrayListlist = newArrayList<>() ...

  3. goland gorm分组查询统计_golang gorm 计算字段和获取sum()值的实现

    计算表lb_ytt_user_money_log 中,字段money的和 代码如下: var total_money []int sqlstr := `select SUM(money) as tot ...

  4. mysql分组后按条件统计_Mysql-分组按条件统计

    现在有数据表,保存消息信息,包括消息类型,阅读状态,推送时间等字段,如附件图片.需求是要根据消息类型分组,找出每组最后推送时间,最后推送的消息标题,以及是否有未读信息,未读信息的数量等内容. 获取每种 ...

  5. java操作es聚合操作并显示其他字段_java使用elasticsearch分组进行聚合查询过程解析...

    这篇文章主要介绍了java使用elasticsearch分组进行聚合查询过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 java连接elas ...

  6. java操作es聚合操作并显示其他字段_java使用elasticsearch分组进行聚合查询(group by)-项目中实际应用...

    java连接elasticsearch 进行聚合查询进行相应操作 一:对单个字段进行分组求和 1.表结构图片: 根据任务id分组,分别统计出每个任务id下有多少个文字标题 1.SQL:select i ...

  7. python分组统计数据_数据分组统计

    统计分析数据的时候,经常需要进行分组统计.分组操作在python里的实现方式就是groupby语句. 惯例,咱们先造一个DataFrame表. import pandas as pd dic={ 'c ...

  8. 07-17 分组聚合--基本的统计方法

    分组聚合–主要有以下知识点: 1.描述性统计知识 ,如min() 最小值,max() 最大值,median() --中位数,mead() 均值,quantitle 分位数,quantitle(0.1, ...

  9. 【python数据分析】数据的分组,遍历,统计

    数据的分组,遍历,统计 俗话说:"人与类聚,物以群分",到这里我们将学习数据的分组以及分组后统计.Pandas的分组相对于Excel会更加简单和灵活. 1️⃣分组 Pandas提供 ...

最新文章

  1. 计算机组成原理cache命中率
  2. UA MATH566 统计理论1 充分统计量例题答案3
  3. opencv python destroyAllWindows() destroyWindow() 销毁窗口
  4. 箭头标线的类型和面积
  5. 0326互联网新闻 | 字节跳动推出阅读产品番茄小说;微信正式上线物流助手接口功能...
  6. python中temp_python temp是什么
  7. cdev_init() / cedev_alloc() / cdev_del()
  8. 机器学习算法-随机森林之决策树R 代码从头暴力实现(3)
  9. GitHub项目功能理解
  10. 几种关系型数据库比较
  11. Sublime Text3 python交互式环境+快捷键设置
  12. python——类别型数据标签二值化-one_hot编码
  13. OpenSolaris系统管理
  14. 小蚂蚁学习C语言(2)——C语言编程预备知识(上)
  15. 056 日志的正则式方式加载
  16. 李雅普诺夫(第二方法)稳定性分析+例题
  17. 计算机学win7画图,win7自带画图工具(mspaint.exe)
  18. Chrome的视频加速插件
  19. jQuery删除表格中指定行
  20. 谷歌 Google Custom Search 站内搜索功能

热门文章

  1. 2020-11-25(《深入理解计算机系统》多级页表详解)
  2. 博客从“新浪云“迁移到CSDN的说明
  3. 1.2 String字符串和整型int的相互转换,valueOf() 、parse()和toString()
  4. 如何转载别人的CSDN文章
  5. Python网络爬虫与信息提取(二):网络爬虫之提取
  6. MySQL中的用户管理
  7. Mybatis动态的添加删除列
  8. MySQL查询所有字段
  9. 海量数据下如何使用多线程的导出 Excel
  10. 你一定不知道的 Linux 使用技巧