单值聚合(结果是一个简单的数值等)
1、sum:求和
2、min:最小值
3、max:最大值
4:cardinality:基数(集合中不同元素的个数)
5、avg:平均值
…
例如:结合javaApi
SearchRequest searchRequest = new SearchRequest("goods");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
AvgAggregationBuilder avgAggregationBuilder = new AvgAggregationBuilder("avg_price")//为聚合函数命名
.field("price");//聚合的字段
sourceBuilder.query(QueryBuilders.termQuery("name", "小米"))
.aggregation(avgAggregationBuilder)//在查询中添加聚合函数
.size(0);//不返回查询结果
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Aggregations aggregations = searchResponse.getAggregations();
对应的elastice查询json数据:
{
"size": 0,
"query": {
"term": {
"name": {
"value": "小米",
"boost": 1.0
}
}
},
"aggregations": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
结果:
{
"hits": {
"total": {
"value": 390,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"avg#avg_price": {
"value": 2613.9487435897437
}
}
}
javaApi结果:
多值聚合
1、terms
:统计每一种结果的数量
…
n、histogram
:直方图,区间间隔。比如统计price每隔1000,[0,1000),[1000,2000)…。参数:interval:设置区间间隔、minBound maxBound:指定区间边界、minDocCount:指定每个区间中的结果数量,大于等于才这个值会返回(默认0,即不管有没有结果都返回)
terms举例:javaApi
SearchRequest searchRequest = new SearchRequest("goods");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
TermsAggregationBuilder avgAggregationBuilder = new TermsAggregationBuilder("terms_price")
.field("price")
.size(1);//只返回一个'桶'
sourceBuilder.query(QueryBuilders.termQuery("name", "小米"))
.aggregation(avgAggregationBuilder)
.size(0);//不返回查询结果
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Aggregations aggregations = searchResponse.getAggregations();
对应的elasticSearch语句
{
"size": 0,
"query": {
"term": {
"name": {
"value": "小米",
"boost": 1.0
}
}
},
"aggregations": {
"terms_price": {
"terms": {
"field": "price",
"size": 10,
"min_doc_count": 1,
"shard_min_doc_count": 0,
"show_term_doc_count_error": false,
"order": [
{
"_count": "desc"
},
{
"_key": "asc"
}
]
}
}
}
}
将每一种price结果放入一个’桶’
{
"hits": {
"total": {
"value": 390,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"dterms#terms_price": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 271,
"buckets": [
{
"key": 1299.0,
"doc_count": 18
},
{
"key": 1999.0,
"doc_count": 15
}
......
]
}
}
}
price为1299的数据有18条
多个聚合函数
一个查询语句中可以添加多个聚合函数,这些聚合是平级的。和嵌套聚合有所区别
javaApi:
SearchRequest searchRequest = new SearchRequest("goods");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
AvgAggregationBuilder avgAggregationBuilder = new AvgAggregationBuilder("avg_price")
.field("price");
MaxAggregationBuilder maxAggregationBuilder = new MaxAggregationBuilder("terms_price")
.field("price");
sourceBuilder.query(QueryBuilders.termQuery("name", "小米"))
.aggregation(avgAggregationBuilder)//添加第一个聚合函数
.aggregation(maxAggregationBuilder)//添加第二个聚合函数
.size(0);//不返回查询结果
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Aggregations aggregations = searchResponse.getAggregations();
对应的语句:
{
"size": 0,
"query": {
"term": {
"name": {
"value": "小米",
"boost": 1.0
}
}
},
"aggregations": {
"avg_price": {
"avg": {
"field": "price"
}
},
"max_price": {
"max": {
"field": "price"
}
}
}
}
结果:
{
"hits": {
"total": {
"value": 390,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"max#max_price": {
"value": 18999.0
},
"avg#avg_price": {
"value": 2613.9487435897437
}
}
}
嵌套聚合
注意嵌套聚合和平级聚合的区别
javaApi构造:
SearchRequest searchRequest = new SearchRequest("goods");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
TermsAggregationBuilder termsAggregationBuilder = new TermsAggregationBuilder("terms_price")
.field("price");
AvgAggregationBuilder avgAggregationBuilder = new AvgAggregationBuilder("avg_price")
.field("price");
MaxAggregationBuilder maxAggregationBuilder = new MaxAggregationBuilder("max_price")
.field("price");
termsAggregationBuilder.subAggregation(maxAggregationBuilder);//嵌套子聚合
sourceBuilder.query(QueryBuilders.termQuery("name", "小米"))
.aggregation(termsAggregationBuilder)//添加聚合函数
.aggregation(avgAggregationBuilder)//添加平级聚合函数
.size(0);//不返回查询结果
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Aggregations aggregations = searchResponse.getAggregations();
对应语句:
结果: