elasticsearch聚合分组查询java API实现
2016-07-23 00:00
465 查看
摘要: 最近用elasticsearch实现统计分析的功能,用到了统计每天24小时各个小时的数据。
elasticsearch在实现按时间分组聚合还是挺方便的。
elasticsearch在实现按时间分组聚合还是挺方便的。
/** * @Description:查询某个时间区间每个小时新增回答数量 * @param condtion * @return */ public Map<String,String> queryNewAnswerByhours(SearchCondtion condtion){ Map<String,String> map = new HashMap<>(); //开始时间和结束时间不可为空 if(null == condtion || null == condtion.getStarTime() || null == condtion.getEndTime()){ return map; } BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); // 依据查询索引库名称创建查询索引 SearchRequestBuilder searchRequestBuilder = ElasticSearchTool.client.prepareSearch(ES_INDEX); //设置查询文档,表名 searchRequestBuilder.setTypes(ES_TYPE_ANSWER); //设置查询类型 searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH); boolQueryBuilder.must(QueryBuilders.matchPhraseQuery("isclosed", "false")); boolQueryBuilder.must(QueryBuilders.matchPhraseQuery("isdelete", "false")); //时间格式化成 yyyy/MM/dd HH:mm:ss String startTime = DateUtil.getFormatDateTime(condtion.getStarTime(), DateUtil.INDEX_TIME_FORMEAT); String endTime = DateUtil.getFormatDateTime(condtion.getEndTime(),DateUtil.INDEX_TIME_FORMEAT); //时间范围 boolQueryBuilder.must(QueryBuilders.rangeQuery("createtime").gt(startTime).lte(endTime)); DateHistogramBuilder dateAgg = AggregationBuilders.dateHistogram("createtime"); dateAgg.field("createtime"); //按小时聚合 dateAgg.interval(DateHistogramInterval.HOUR); //设置时间区间 dateAgg.extendedBounds(DateUtil.getFormatDateTime(condtion.getStarTime(), DateUtil.SDF_YYYY_MM_DD_HH),DateUtil.getFormatDateTime(condtion.getEndTime(), DateUtil.SDF_YYYY_MM_DD_HH)); //按小时分组,必须使用这个方法,不然得到的结果不正确 dateAgg.format(DateUtil.SDF_YYYY_MM_DD_HH); searchRequestBuilder.addSort("createtime", SortOrder.ASC); //创建时间顺序
searchRequestBuilder .setQuery(boolQueryBuilder) .addAggregation(dateAgg); SearchResponse r = searchRequestBuilder.get(); //获取查询结果 Histogram h = r.getAggregations().get("createtime");//得到查询结果 List<Histogram.Bucket> buckets = (List<Histogram.Bucket>) h.getBuckets(); for(Histogram.Bucket b:buckets){ map.put(b.getKeyAsString(), b.getDocCount() + ""); } return map; }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Manifest 用法
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 什么是 GraphQL?
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- Spark RDD API详解(一) Map和Reduce
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序