/** * 分组统计 */ 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()); }