为什么80%的码农都做不了架构师?>>>   

Elasticsearch聚合查询案例分享

1.案例介绍

本文包含三个案例:

案例1:统计特定时间范围内每个应用的总访问量、访问成功数、访问失败数,每个应用请求响应时间分段统计(1秒内,1-3秒,3-5秒,5秒以上 )

案例2:简单的term统计

案例3:简单的cardinality统计

2.准备工作

参考文档《高性能elasticsearch ORM开发库使用介绍》中的第1章节和第2章节,在自己的工程中导入bboss es依赖包和配置es参数

3.案例

3.1 案例1

3.1.1 定义统计dsl

在源码目录下新建文件esmapper/estrace/ESTracesMapper.xml,内容如下

<properties><!--应用汇总统计:总访问量,成功数,失败数bboss es dao通过名称applicationSumStatic引用脚本--><property name="applicationSumStatic"><![CDATA[{"query": {"bool": {"filter": [#if($channelApplications && $channelApplications.size() > 0){"terms": {"applicationName.keyword": [ ##指定并统计多个应用的数据#foreach($application in $channelApplications)#if($velocityCount > 0),#end $application.applicationName#end]}},#end{"range": {"startTime": {"gte": #[startTime],##统计开始时间"lt": #[endTime]  ##统计截止时间}}}]}},"size":0,"aggs": {"applicationsums": {"terms": {"field": "applicationName.keyword",##按应用名称进行统计计数"size":10000},"aggs":{"successsums" : {"terms" : {"field" : "err" ##按err标识统计每个应用的成功数和失败数,0标识成功,1标识失败}},"elapsed_ranges" : {"range" : {"field" : "elapsed", ##按响应时间分段统计"keyed" : true,"ranges" : [{ "key" : "1秒", "to" : 1000 },{ "key" : "3秒", "from" : 1000, "to" : 3000 },{ "key" : "5秒", "from" : 3000, "to" : 5000 },{ "key" : "5秒以上", "from" : 5000 }]}}}}}}]]></property>
</properties>

3.1.2 编写统计dao及统计方法

Java代码

public class TraceESDao {    public List<ApplicationStatic> getApplicationSumStatic(TraceExtraCriteria traceExtraCriteria){ClientInterface clientUtil= ElasticSearchHelper.getConfigRestClientUtil("esmapper/estrace/ESTracesMapper.xml");//返回json统计报文,调试用,一遍根据json报文组装统计结果列表
//      String response = clientUtil.executeRequest("trace-*/_search",
//                                  "applicationSumStatic",traceExtraCriteria);//根据条件进行统计,在对象traceExtraCriteria中指定开始时间和结束时间MapRestResponse restResponse = clientUtil.search("trace-*/_search","applicationSumStatic",traceExtraCriteria);//组装统计结果//获取应用统计列表,包含每个应用的名称、总访问量以及成功数和失败数List<Map<String,Object>> appstatics = (List<Map<String,Object>>)restResponse.getAggBuckets("applicationsums");if(appstatics != null && appstatics.size() > 0) {List<ApplicationStatic> applicationStatics = new ArrayList<ApplicationStatic>(appstatics.size());ApplicationStatic applicationStatic = null;for (int i = 0; i < appstatics.size(); i++) {applicationStatic = new ApplicationStatic();Map<String, Object> map = appstatics.get(i);//应用名称String appName = (String) map.get("key");applicationStatic.setApplicationName(appName);//应用总访问量Long totalsize = ResultUtil.longValue( map.get("doc_count"),0l);applicationStatic.setTotalSize(totalsize);//获取成功数和失败数List<Map<String, Object>> appstatic = (List<Map<String, Object>>)ResultUtil.getAggBuckets(map, "successsums");/**"buckets": [{"key": 0,"doc_count": 30}]*///key 0Long success = 0l;//成功数Long failed = 0l;//失败数for (int j = 0; j < appstatic.size(); j++) {Map<String, Object> stats = appstatic.get(j);Integer key = (Integer) stats.get("key");//成功和错误标识if (key == 0)//成功success = ResultUtil.longValue( stats.get("doc_count"),0l);else if (key == 1)//失败failed = ResultUtil.longValue( stats.get("doc_count"),0l);}applicationStatic.setSuccessCount(success);applicationStatic.setFailCount(failed);List<ApplicationPeriodStatic> applicationPeriodStatics = new ArrayList<ApplicationPeriodStatic>(4);ApplicationPeriodStatic applicationPeriodStatic = null;//获取响应时间分段统计信息Map<String, Map<String, Object>> appPeriodstatic = (Map<String, Map<String, Object>>)ResultUtil.getAggBuckets(map, "elapsed_ranges");//1秒Map<String, Object> period = appPeriodstatic.get("1秒");applicationPeriodStatic = new ApplicationPeriodStatic();applicationPeriodStatic.setPeriod("1秒");applicationPeriodStatic.setDocCount(ResultUtil.longValue(period.get("doc_count"),0l));applicationPeriodStatic.setTo(ResultUtil.intValue(period.get("to"),1000));applicationPeriodStatics.add(applicationPeriodStatic);//3秒period = appPeriodstatic.get("3秒");applicationPeriodStatic = new ApplicationPeriodStatic();applicationPeriodStatic.setPeriod("3秒");applicationPeriodStatic.setDocCount(ResultUtil.longValue(period.get("doc_count"),0l));applicationPeriodStatic.setFrom(ResultUtil.intValue(period.get("from"),1000));applicationPeriodStatic.setTo(ResultUtil.intValue(period.get("to"),3000));applicationPeriodStatics.add(applicationPeriodStatic);//5秒period = appPeriodstatic.get("5秒");applicationPeriodStatic = new ApplicationPeriodStatic();applicationPeriodStatic.setPeriod("5秒");applicationPeriodStatic.setDocCount(ResultUtil.longValue(period.get("doc_count"),0l));applicationPeriodStatic.setFrom(ResultUtil.intValue(period.get("from"),3000));applicationPeriodStatic.setTo(ResultUtil.intValue(period.get("to"),5000));applicationPeriodStatics.add(applicationPeriodStatic);//5秒以上period = appPeriodstatic.get("5秒以上");applicationPeriodStatic = new ApplicationPeriodStatic();applicationPeriodStatic.setPeriod("5秒以上");applicationPeriodStatic.setDocCount(ResultUtil.longValue(period.get("doc_count"),0l));applicationPeriodStatic.setFrom(ResultUtil.intValue(period.get("from"),5000));applicationPeriodStatics.add(applicationPeriodStatic);applicationStatic.setApplicationPeriodStatics(applicationPeriodStatics);applicationStatics.add(applicationStatic);}//返回统计结果return applicationStatics;}return null;}
}

3.1.3 执行测试用例

Java代码

@Testpublic void testAppStatic(){TraceExtraCriteria traceExtraCriteria = new TraceExtraCriteria();traceExtraCriteria.setStartTime(1516304868072l);traceExtraCriteria.setEndTime(1516349516377l);ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil("esmapper/estrace/ESTracesMapper.xml");//通过下面的方法先得到查询的json报文,然后再通过MapRestResponse查询遍历结果,调试的时候打开String response的注释//String response = clientUtil.executeRequest("trace-*/_search","applicationSumStatic",traceExtraCriteria);//System.out.println(response);MapRestResponse restResponse = clientUtil.search("trace-*/_search","applicationSumStatic",traceExtraCriteria);List<Map<String,Object>> appstatics = restResponse.getAggBuckets("applicationsums",new ESTypeReference<List<Map<String,Object>>>(){});int doc_count_error_upper_bound = restResponse.getAggAttribute("applicationsums","doc_count_error_upper_bound",int.class);int sum_other_doc_count = restResponse.getAggAttribute("applicationsums","sum_other_doc_count",int.class);System.out.println("doc_count_error_upper_bound:"+doc_count_error_upper_bound);System.out.println("sum_other_doc_count:"+sum_other_doc_count);for(int i = 0; i < appstatics.size(); i ++){Map<String,Object> map = appstatics.get(i);//应用名称String appName = (String)map.get("key");//应用总访问量int totalsize =  (int)map.get("doc_count");//获取成功数和失败数List<Map<String,Object>> appstatic = ResultUtil.getAggBuckets(map ,"successsums",new ESTypeReference<List<Map<String,Object>>>(){});doc_count_error_upper_bound = ResultUtil.getAggAttribute(map ,"successsums","doc_count_error_upper_bound",int.class);sum_other_doc_count = ResultUtil.getAggAttribute(map ,"successsums","sum_other_doc_count",int.class);System.out.println("doc_count_error_upper_bound:"+doc_count_error_upper_bound);System.out.println("sum_other_doc_count:"+sum_other_doc_count);/**"buckets": [{"key": 0,"doc_count": 30}]*///key 0int success = 0;//成功数int failed = 0;//失败数for(int j = 0; j < appstatic.size(); i ++){Map<String,Object> stats = appstatic.get(i);int key = (int) stats.get("key");//成功和错误标识if(key == 0)success = (int)stats.get("doc_count");else if(key == 1)failed = (int)stats.get("doc_count");}}}

3.1.4 获取元数据信息的测试方法

java代码

@Testpublic void testAppStatic(){TraceExtraCriteria traceExtraCriteria = new TraceExtraCriteria();traceExtraCriteria.setStartTime(1516304868072l);traceExtraCriteria.setEndTime(1516349516377l);ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil("esmapper/estrace/ESTracesMapper.xml");//通过下面的方法先得到查询的json报文,然后再通过MapRestResponse查询遍历结果,调试的时候打开String response的注释//String response = clientUtil.executeRequest("trace-*/_search","applicationSumStatic",traceExtraCriteria);//System.out.println(response);MapRestResponse restResponse = clientUtil.search("trace-*/_search","applicationSumStatic",traceExtraCriteria);List<Map<String,Object>> appstatics = restResponse.getAggBuckets("applicationsums",new ESTypeReference<List<Map<String,Object>>>(){});int doc_count_error_upper_bound = restResponse.getAggAttribute("applicationsums","doc_count_error_upper_bound",int.class);int sum_other_doc_count = restResponse.getAggAttribute("applicationsums","sum_other_doc_count",int.class);System.out.println("doc_count_error_upper_bound:"+doc_count_error_upper_bound);System.out.println("sum_other_doc_count:"+sum_other_doc_count);for(int i = 0; i < appstatics.size(); i ++){Map<String,Object> map = appstatics.get(i);//应用名称String appName = (String)map.get("key");//应用总访问量int totalsize =  (int)map.get("doc_count");//获取成功数和失败数List<Map<String,Object>> appstatic = ResultUtil.getAggBuckets(map ,"successsums",new ESTypeReference<List<Map<String,Object>>>(){});doc_count_error_upper_bound = ResultUtil.getAggAttribute(map ,"successsums","doc_count_error_upper_bound",int.class);sum_other_doc_count = ResultUtil.getAggAttribute(map ,"successsums","sum_other_doc_count",int.class);System.out.println("doc_count_error_upper_bound:"+doc_count_error_upper_bound);System.out.println("sum_other_doc_count:"+sum_other_doc_count);/**"buckets": [{"key": 0,"doc_count": 30}]*///key 0int success = 0;//成功数int failed = 0;//失败数for(int j = 0; j < appstatic.size(); i ++){Map<String,Object> stats = appstatic.get(i);int key = (int) stats.get("key");//成功和错误标识if(key == 0)success = (int)stats.get("doc_count");else if(key == 1)failed = (int)stats.get("doc_count");}}}

3.2 案例2 简单的term统计

3.2.1 定义dsl

建立dsl配置文件esmapper/testagg.xml,定义termAgg:

    <property name="termAgg"><![CDATA[{## 设置查询条件#* 注释掉统计条件  *#"query": {"bool": {"filter": [{"term": {"applicationName.keyword": #[application]}},{"term": {"rpc.keyword": #[rpc]}},{"range": {"startTime": {"gte": #[startTime],"lt": #[endTime]}}}]}},"size":0,## 聚合查询"aggs": {"traces": {"terms": {"field": "rpc.keyword","size":10000}}}}]]></property>

3.2.2 执行dsl

@Testpublic void termAgg(){ClientInterface clientInterface = ElasticSearchHelper.getConfigRestClientUtil("esmapper/testagg.xml");//ESDatas<Map> traces = clientInterface.searchAll("trace-*",1000,Map.class);//获取总记录集合Map params = new HashMap();//聚合统计条件参数params.put("application","testweb");SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:dd");try {params.put("startTime",format.parse("1999-01-01 00:00:00").getTime());params.put("endTime",new Date().getTime());params.put("rpc","/testweb/jsp/logoutredirect.jsp");} catch (ParseException e) {e.printStackTrace();}//一行代码,执行每个服务的访问量总数统计ESAggDatas<LongAggHit> response = clientInterface.searchAgg("trace-*/_search",//从trace-开头的索引表中检索数据"termAgg", //配置在esmapper/testagg.xml中的dsl语句params,    //dsl语句termAgg中需要的查询参数LongAggHit.class,  //封装聚合统计中每个服务地址及服务访问量的地址"traces");  //term统计桶的名称,参见dsl语句List<LongAggHit> aggHitList = response.getAggDatas();//每个服务的访问量long totalSize = response.getTotalSize();//总访问量}

3.3 案例3 简单的cardinality统计

3.3.1 定义dsl

建立dsl配置文件esmapper/testagg.xml,定义candicateAgg:

    <property name="candicateAgg"><![CDATA[{## 设置查询条件#* 注释掉统计条件"query": {"bool": {"filter": [{"term": {"applicationName.keyword": #[application]}},{"term": {"rpc.keyword": #[rpc]}},{"range": {"startTime": {"gte": #[startTime],"lt": #[endTime]}}}]}},*#"size":0,## 聚合查询"aggs": {"traces": {"cardinality" : {"field" : "rpc.keyword","precision_threshold": 100}}}}]]></property>

3.3.2 执行dsl

   @Testpublic void candicateAgg(){ClientInterface clientInterface = ElasticSearchHelper.getConfigRestClientUtil("esmapper/testagg.xml");Map params = null;//单值聚合统计条件参数//一行代码,执行服务基数统计ESAggDatas<SingleLongAggHit> response = clientInterface.searchAgg("trace-*/_search","candicateAgg",params,SingleLongAggHit.class,"traces");SingleLongAggHit aggHitList = response.getSingleAggData();long value = aggHitList.getValue();long totalSize = response.getTotalSize();//总访问量}

4.相关资料

高性能elasticsearch ORM开发库使用介绍

https://my.oschina.net/bboss/blog/1556866

bboss elasticsearch交流:166471282

转载于:https://my.oschina.net/bboss/blog/1610016

Elasticsearch聚合查询案例分享相关推荐

  1. php聚合查询,php elasticsearch 聚合查询(Aggregation)

    Elasticsearch中的聚合查询,类似SQL的SUM/AVG/COUNT/GROUP BY分组查询,主要用于统计分析场景. 这里主要介绍PHP Elasticsearch 聚合查询的写法,如果不 ...

  2. Elasticsearch聚合查询多字段设置权重

    Elasticsearch聚合查询多字段设置权重 背景 环境说明 script设置权重 小结 背景 实际应用中,可能会需要为为doc文档中某个字段的某些特定的值设置权重,影响排序.es提供了比较灵活的 ...

  3. ElasticSearch聚合查询返回结果buckets取值

    ElasticSearch聚合查询返回结果buckets取值 1.聚合查询如下: {"size":0,"query":{"bool":{&q ...

  4. ElasticSearch聚合查询Restful语法和JavaApi详解(基于ES7.6)

    本文收录于github和gitee ,里面有我完整的Java系列文章,学习或面试都可以看看 (一)概述 在前面关于ES的一系列文章中,已经介绍了ES的概念.常用操作.JavaAPI以及实际的一个小de ...

  5. ES/ElasticSearch 聚合查询时报错:too_many_buckets_exception

    环境:ElasticSearch6.7 问题描述: {"error": {"root_cause": [],"type": "se ...

  6. (转)Elasticsearch 聚合查询、桶聚合、管道聚合及复合查询

    转自: https://blog.csdn.net/zx711166/article/details/81906881 聚合查询 聚合是一种基于查询条件对数据进行分桶.计算的方法. 聚合可以嵌套,由此 ...

  7. ElasticSearch 聚合查询

    价格总和: 1,使用aggs   2,自己起个名字price_of_sum  3,求和sum   4,filed要求和的字段 GET /lib5/items/_search {"aggs&q ...

  8. ElasticSearch 聚合查询 JavaApi

    ES 聚合查询Java Api 分页查询,按照时间进行分组查询求平均(多平均),按照某一字段分组求聚合等等 分页查询 SysUser loginUser = SecurityUtils.getLogi ...

  9. java中使用ElasticSearch聚合查询代码实例(个人笔记,不喜勿喷)

    PS→无奈:拥有梦想只是一种智力,实现梦想才是一种能力. 空闲之余就把先前做过的一个通过ElasticSearch的聚合来实现查询当月实际签到的天数记录一下,纯留下点记忆,大家勿喷. 1.如果不了解e ...

最新文章

  1. FastReport.net 使用 Winform WebForm打印
  2. 添加10个用户user1到user10,但要求只有用户不存在的情况下才能添加
  3. Java并发工具类Semaphore应用实例
  4. 为什么最近的食盐用量增加了?
  5. 【博客】csdn搬家到wordpress
  6. 我是如何自学 Python 的,分享一下经验
  7. openCV,C++接口,cv::Mat矩阵数据元素读取
  8. 在FMS服务器端侦听流的发布
  9. 小米路由器3开启frp
  10. [deepstream][原创]更改deepstream_test1_app在弹出视频上显示fps
  11. Linux学习第一节课
  12. RabbitMQ高级特性-惰性队列
  13. python超级简单爬虫
  14. 在git bash中输入git init 提示错误信息: fatal: open /dev/null or dup failed: No such file or directory的解决办法
  15. python编程玩具有哪些_python 全栈开发,Day133(玩具与玩具之间的对话,基于jieba gensim pypinyin实现的自然语言处理,打包apk)...
  16. 乐游api接口平台(接口商)
  17. IT人面试秘籍:面试官背后的小心思都在这儿
  18. python折叠代码_Python实现代码块儿折叠
  19. outlook2016把日历导出html,如何将Outlook日历导出到Excel每周时间表?
  20. wifi室内人员定位技术,原理浅析-新导智能

热门文章

  1. Winform中使用异或算法对数字进行加密解密
  2. MyBatisPlus条件构造器带条件更新update使用
  3. IDEA中安装MyBatis Log Plugin插件完整显示执行的mybatis的sql语句
  4. Vue实现仿音乐播放器4-Vue-router实现音乐导航菜单切换
  5. mybatis中使用XML配置文件方式实现CRUD模板流程
  6. 从0-1教你利用服务器做属于自己的个人博客
  7. matlab高级图形设计实训上机答案,Matlab实验第一次实验答案[共8页]
  8. html5时钟代码菜鸟课程,html5绘制时钟动画
  9. PPT 下载 | 神策数据张涛:企业服务客户全生命周期运营三步曲客情诊断 解决方案库...
  10. 神策数据 × 水滴汽车:着眼车主忠诚度,实现转型期逆势增长!