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