/** * 分組統計 */ public static void termsAgg() { //分組統計每一個年齡有多少人 AggregationBuilder aggregation = AggregationBuilders.terms("terms").field("age"); SearchResponse response = getClient().prepareSearch("my_person").addAggregation(aggregation).execute() .actionGet(); Terms terms = response.getAggregations().get("terms"); for (Terms.Bucket bucket : terms.getBuckets()) { System.out.println(bucket.getKey() + ":" + bucket.getDocCount()); } }
測試:測試
public static void main(String[] args) { termsAgg(); }
執行結果:ui
20:3 22:1 23:1 28:1
/** * 過濾分組 */ public static void filterAgg() { //過濾條件 QueryBuilder query = QueryBuilders.termQuery("age", 20); //經過過濾條件進行分組 AggregationBuilder aggregation = AggregationBuilders.filter("filter", query); SearchResponse response = getClient().prepareSearch("my_person").addAggregation(aggregation).execute() .actionGet(); System.out.println(response.getAggregations().get("filter").toString()); }
測試spa
public static void main(String[] args) { filterAgg(); }
執行結果:code
{"filter":{"doc_count":3}}
/** * 多個過濾條件統計 */ public static void filtersAgg() { //多個過濾條件分組統計(每一個過濾條件單獨統計,互補影響) AggregationBuilder aggregation = AggregationBuilders.filters("filters", new FiltersAggregator.KeyedFilter("ageAgg", QueryBuilders.termQuery("age", 20)),//年齡20的文檔個數 new FiltersAggregator.KeyedFilter("salaryAgg", QueryBuilders.termQuery("salary", 6000)));//薪資6000的文檔個數 SearchResponse response = getClient().prepareSearch("my_person").addAggregation(aggregation).execute() .actionGet(); Filters filters = response.getAggregations().get("filters"); for (Filters.Bucket bucket : filters.getBuckets()) { System.out.println(bucket.getKeyAsString()+"="+bucket.getDocCount()); } }
測試orm
public static void main(String[] args) { filtersAgg(); }
執行結果,在全部文檔中「age」爲「20」的文檔個數是3,「salary」爲 "6000"的文檔個數是1文檔
ageAgg=3 salaryAgg=1
包含前邊界,不包含後邊界get
/** * 範圍統計 */ public static void rangeAgg() { AggregationBuilder aggregation = AggregationBuilders.range("rangeAgg") .field("age") .addUnboundedTo(22)//從無窮小到22(不包含22) .addRange(22, 28)//22到28(包含22不包含28) .addUnboundedFrom(28);//從28開始到無窮大(包含28) SearchResponse response = getClient().prepareSearch("my_person").addAggregation(aggregation).execute().actionGet(); Range range = response.getAggregations().get("rangeAgg"); for (Range.Bucket bucket : range.getBuckets()) { System.out.println(bucket.getKey()+"="+bucket.getDocCount()); } }
測試,文檔數據中年齡分佈:20,20,20,22,23,28io
public static void main(String[] args) { rangeAgg(); }
執行結果form
*-22.0=3 22.0-28.0=2 28.0-*=1
包含前邊界,不包含後邊界date
/** * 日期範圍統計 */ public static void dateRangeAgg() { AggregationBuilder aggregation = AggregationBuilders.dateRange("dateAgg") .field("pubdate") .format("yyyy-MM-dd'T'HH:mm:ss") .addUnboundedTo("2018-07-17T12:33:11")// 從無窮小到2018-07-17T12:33:11(不包含) .addUnboundedFrom("2018-07-17T14:14:55");// 從2018-07-17T17:16:30到無窮大(包含) SearchResponse response = getClient().prepareSearch("telegraph").addAggregation(aggregation).execute() .actionGet(); Range range = response.getAggregations().get("dateAgg"); for (Range.Bucket bucket : range.getBuckets()) { System.out.println(bucket.getKey()+"="+bucket.getDocCount()); } }
測試
public static void main(String[] args) { dateRangeAgg(); }
結果
*-2018-07-17T12:33:11=0 2018-07-17T14:14:55-*=3
/** * 統計字段爲空文檔數量 */ public static void missingAgg() { //統計pubdate爲空文檔數量 AggregationBuilder aggregation = AggregationBuilders.missing("missingAgg").field("pubdate"); SearchResponse response = getClient().prepareSearch("telegraph").addAggregation(aggregation).execute() .actionGet(); Missing missing = response.getAggregations().get("missingAgg"); System.out.println(missing.getDocCount()); }