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

ElasticSearch中用aggs聚合求每分钟数据求和,并用java获取到数据

2016-09-08 09:34 567 查看
ElasticSearch中用aggs聚合求每分钟数据求和,并用java获取到数据.

最近要做一个图表,数据为每分钟委托笔数, 数据在ElasticSearch中存储, 并且每分钟可能有多条数据, 这里就用到了ElasticSearch聚合. 具体的ElasticSearch head插件中语句如下:

{
"query": {
"filtered": {
"filter": {
"bool": {
"must": [
{
"range": {
"time": {
"gte": "2016.09.07 09:15:50",
"lte": "2016.09.07 15:00:00"
}
}
}
]
}
}
}
},
"aggs": {
"articles_over_time": {
"date_histogram": {
"field": "time",
"interval": "minute",
"format": "yyyy-MM-dd HH:mm:ss"
},
"aggs": {
"sum_value": {
"sum": {
"field": "value"
}
}
}
}
}
}


query部分为基本的数据查询,获取时间在23:58:50到23:59:56点之间的所有的数据;

aggs中是对query查询到的数据的聚合: 以”time”字段数据进行聚合, 以每分钟(interval)聚合一次, 时间格式为: “yyyy-MM-dd HH:mm:ss”(这个可以自己定义), 然后进行求和, 最后获得的是每分钟进行一次的sum值.

具体如下:



在java中我们要获取aggregations中数据需要如下代码:

SearchResponse response2 = conn.searchClient.prepareSearch("hydrant-2016.09.07")
.setTypes(type)
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(queryStr) .addAggregation(AggregationBuilders.dateHistogram("articles_over_time").field("time").interval(Interval.MINUTE).format("yyyy-MM-dd HH:mm:ss")
.subAggregation(AggregationBuilders.sum("sum_value").field("value")))
.execute().actionGet();

DateHistogram terms = response2.getAggregations().get("articles_over_time");
List<DateHistogram> bucketSize = (List<DateHistogram>) terms.getBuckets();

//第一种方式获取sum_value以及value值
InternalSum m = (InternalSum)terms.getBuckets().get(0).getAggregations().asList().get(0);
System.out.println(m.getName()+"== =="+m.getValue());  //获得name: "sum_value" / 值(value): 63
//第二种方式获取sum_value以及value值
//          Iterator  s=terms.getBuckets().get(0).getAggregations().iterator();  //获取聚合函数数组
//          while(s.hasNext()){  //遍历, 获取name, value
//              InternalSum m=(InternalSum) s.next();
//              System.out.println(m.getName()+"== =="+m.getValue());
//          }
System.out.println(terms.getBuckets().get(0).getKey());//获得时间 "key_as_string": "2016-09-07 23:58:00"
System.out.println(terms.getBuckets().get(0).getDocCount());  //获得 "doc_count": 1,


.addAggregation(AggregationBuilders.dateHistogram(“articles_over_time”).field(“time”).interval(Interval.MINUTE).format(“yyyy-MM-dd HH:mm:ss”)

.subAggregation(AggregationBuilders.sum(“sum_value”).field(“value”)))是对ElasticSearch中如下语句进行的封装

"aggs": {
"articles_over_time": {  //自定义
"date_histogram": {
"field": "time",
"interval": "minute",
"format": "yyyy-MM-dd HH:mm:ss"
},
"aggs": {
"sum_value": {
"sum": {
"field": "value"
}
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  elasticsearch