ES22-JAVA API 桶聚合

本文介绍了Elasticsearch中各种聚合查询的应用实例,包括分组统计、过滤统计、多个过滤条件统计、区间聚合、日期区间聚合及missing聚合等。通过具体代码展示了如何实现这些聚合查询,并提供了执行结果。

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();
	}

执行结果:

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());
	}

测试

public static void main(String[] args) {
		filterAgg();
	}

执行结果:

{"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());
		}
	}

测试

	public static void main(String[] args) {
		filtersAgg();
	}

执行结果,在所有文档中“age”为“20”的文档个数是3,“salary”为 "6000"的文档个数是1

ageAgg=3
salaryAgg=1

4.区间聚合

包含前边界,不包含后边界

/**
	 * 范围统计
	 */
	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,28

public static void main(String[] args) {
		rangeAgg();
	}

执行结果

*-22.0=3
22.0-28.0=2
28.0-*=1

5.日期区间聚合

包含前边界,不包含后边界

	/**
	 * 日期范围统计
	 */
	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());
	}

 

转载于:https://my.oschina.net/u/3100849/blog/1863081

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值