Elasticsearch-聚合
2022-04-05 本文已影响0人
石头耳东
零、本文纲要
- 一、聚合
1、常见的聚合类型
2、参与聚合的字段类型 - 二、聚合DSL
1、桶(Bucket)聚合
① 桶聚合结果排序
② 限定桶聚合范围
2、度量(Metric)聚合 - 三、RestClient实现聚合
1、编写DSL语句
2、解析聚合结果
tips:Ctrl + F快速定位所需内容进行阅读吧。
一、聚合
官方文档:Aggregations。
聚合(aggregations)可以实现对文档数据的统计、分析、运算。
1、常见的聚合类型
- ① 桶(Bucket)聚合
用来对文档做分组:
Ⅰ TermAggregation
:按照文档字段值分组;
Ⅱ Date Histogram
:按照日期阶梯分组,例如一周为一组,或者一月为一组。
- ② 度量(Metric)聚合
用以计算一些值,比如:最大值、最小值、平均值等:
Ⅰ Avg
:求平均值;
Ⅱ Max
:求最大值;
Ⅲ Min
:求最小值;
Ⅳ Stats
:同时求max、min、avg、sum等。
- ③ 管道(pipeline)聚合
其它聚合的结果为基础做聚合。
2、参与聚合的字段类型
keyword、数值、日期、布尔。
二、聚合DSL
1、桶(Bucket)聚合
GET /indexName/_search
{
"size" : 0, //结果中仅包含聚合数据
"aggs" : { //定义聚合,也可以写作aggregations
"AGGNAME" : { //指定聚合名称,自定义
"terms" : { //指定桶类型
"field" : "FIELDNAME", //参与聚合的字段
"size": VALUE //希望获取的聚合结果数量
}
}
}
}
- ① 桶聚合结果排序
添加order实现结果排序,如下:
GET /hotel/_search
{
"size": 0,
"aggs": {
"brandAgg": {
"terms": {
"field": "brand",
"order": {
"_count": "asc" //根据_count字段升序排序
},
"size": 20
}
}
}
}
桶聚合结果排序.png
- ② 限定桶聚合范围
添加query限制,如下:
GET /hotel/_search
{
"query": {
"range": {
"price": {
"lte": 200
}
}
},
"size": 0,
"aggs": {
"brandAgg": {
"terms": {
"field": "brand",
"size": 20
}
}
}
}
下图对比了两种搜索,未限制条件时10条
可以完整查询到;限制条件后,仅剩4条
结果符合限制条件。具体如下:
2、度量(Metric)聚合
GET /hotel/_search
{
"size": 0,
"aggs": {
"brandAgg": {
"terms": {
"field": "brand",
"size": 20,
"order": {
"scoreAgg.avg": "desc" //根据子查询中的avg降序排序
}
},
"aggs": { //是brandAgg聚合的子聚合,brandAgg聚合后再分组计算
"scoreAgg": { //子聚合名称
"stats": { // 聚合类型,可以计算count、min、max、sum、avg
"field": "score" //聚合字段,此处为score
}
}
}
}
}
}
度量(Metric)聚合.png
三、RestClient实现聚合
1、编写DSL语句
// 2. 编写DSL语句
request.source().size(0);
request.source().aggregation(
AggregationBuilders
.terms("brandAgg")
.field("brand")
.size(10)
);
image.png
2、解析聚合结果
// 4. 解析结果
// 4.1 解析聚合结果
Aggregations aggregations = response.getAggregations();
// 4.2 根据名称获取聚合结果
Terms brandTerms = aggregations.get("brandAgg");
// 4.3 获取桶
List<? extends Terms.Bucket> buckets = brandTerms.getBuckets();
// 4.4 遍历
for (Terms.Bucket bucket : buckets) {
// 4.5 获取key,品牌信息
String brandName = bucket.getKeyAsString();
System.out.println(brandName);
}
解析聚合结果.png
四、结尾
以上即为聚合部分的内容,感谢阅读。