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());
	}
相關文章
相關標籤/搜索