ElasticSearch中用aggs聚合求每分鐘數據求和,並用java獲取到數據

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"
          }
        }
      }
    }
  }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章