您的位置:首页 > 编程语言 > Java开发

elasticsearch聚合分组查询java API实现

2016-07-23 00:00 465 查看
摘要: 最近用elasticsearch实现统计分析的功能,用到了统计每天24小时各个小时的数据。
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息