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"
}
}
}
}
}