ES22-JAVA API 桶聚合

1.分组统计

/**
	 * 分组统计
	 */
	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

2.过滤统计

/**
	 * 过滤分组
	 */
	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}}

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

4.区间聚合

包含前边界,不包含后边界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

5.日期区间聚合

包含前边界,不包含后边界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

6.missing聚合

/**
	 * 统计字段为空文档数量
	 */
	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());
	}
相关文章
相关标签/搜索