Elasticsearch 数据聚合

Bucket聚合(桶聚合)

对文档做分组,aggs

按照文档字段值或日期进行分组,能参与分词的字段不能做聚合,如text类型的字段

例如:根据城市名称做聚合,也就是城市名称对数据进行分组统计。可以加query查询条件,也可以加原数据返回条数size,使用_order对聚合结果按条数进行倒叙排序

bash 复制代码
GET _search
{
  "query": {
    "range": {
      "price": {
        "gte": 100,
        "lte": 500
      }
    }
  }, 
  "size": 1,
  "aggs": {
    "cityAgg": {
      "terms": {
        "field": "city",
        "order": {
          "_count": "desc"
        },
        "size": 2
      }
    }
  }
}

从返回结果可以看出原文档数据并没有返回,分组统计结果也只有规定的两条数据

解释:

bash 复制代码
GET _search
{
  "size": 0,  #size为0表示不显示原文档数据
  "aggs": { #聚合
    "cityAgg": {
      "terms": { #聚合类型,根据城市聚合,是keyword所以选择term
        "field": "city", #字段名
        "size": 2 #获取的聚合结果数量,这里只获取聚合结果的前2条数据
      }
    }
  }
}

Metric聚合(度量聚合)

在桶聚合结果中获取某个字段值的最大值max、最小值min、平均值avg、求和sum等

例如:在上述统计结果,获取评分score字段的最大值max、最小值min、平均值avg、求和sum,加上与terms同级的aggs条件

bash 复制代码
"term":{...},
"aggs": {
        "score_stats": {
          "stats": {
            "field": "score"
          }
        }
      }
bash 复制代码
GET _search
{
  "query": {
    "range": {
      "price": {
        "gte": 100,
        "lte": 500
      }
    }
  }, 
  "size": 1,
  "aggs": {
    "cityAgg": {
      "terms": {
        "field": "city",
        "order": {
          "_count": "desc"
        },
        "size": 2
      }, 
      "aggs": {
        "score_stats": {
          "stats": {
            "field": "score"
          }
        }
      }
    }
  }
}

score_count为自定义名字

如果要根据score_count中的结果进行排序,可以在桶聚合中加:

bash 复制代码
       #根据最大值倒叙排序
        "order": {
          "score_stats.max": "desc"
        },

RestAPI实现聚合

聚合条件与query条件同级别,因此需要使用request.source()来指定聚合条件。

request.source()去点

java 复制代码
        //1.准备Request
        SearchRequest request = new SearchRequest("jungle_study");
        request.source().size(0); //聚合不需要返回具体数据,只需要统计数量
        request.source().aggregation(
                AggregationBuilders.terms("cityAgg")
                        .field("city")
                        .size(10)
        ); //聚合条件,统计城市数量,最多10个
        //3.发生请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //处理相应结果
        Terms cityAgg = response.getAggregations().get("cityAgg");//获取聚合结果
        cityAgg.getBuckets().forEach(bucket -> {
            System.out.println(bucket.getKey() + ":" + bucket.getDocCount());
        });

Terms:

复制代码
import org.elasticsearch.search.aggregations.bucket.terms.Terms;

聚合的官方文档:聚合 |Elasticsearch 指南 [8.13] |弹性的 --- Aggregations | Elasticsearch Guide [8.13] | Elastic

相关推荐
右手吉他5 分钟前
Hostapd系统源代码学习
android
星火开发设计7 分钟前
虚析构函数:解决子类对象的内存泄漏
java·开发语言·前端·c++·学习·算法·知识
好大的月亮11 分钟前
中值法排序及LexoRank排序算法简述
java·算法·排序算法
TongSearch13 分钟前
Tongsearch分片的分配、迁移与生命周期管理
java·服务器·数据库·elasticsearch·tongsearch
androidstarjack19 分钟前
2026 年 IM 即时通讯方案选型实践:4 家主流厂商对比分析
java·spring·spring cloud
智先森zhi22 分钟前
实战:将 Android 多Module应用迁移到 kmp+cmp
android·ios·kotlin
2301_8153577024 分钟前
SpringBoot两大核心数据库连接池:HikariCP与Druid深度实践
java·spring boot
草莓熊Lotso30 分钟前
Linux 程序地址空间深度解析:虚拟地址背后的真相
java·linux·运维·服务器·开发语言·c++·人工智能
heimeiyingwang38 分钟前
官网知识库结构化整理指南
java·sql·架构·database
山东布谷网络科技41 分钟前
对标Yalla和Chamet:海外直播语聊APP中多人派对房的关键技术细节
java·开发语言·人工智能·php·语音识别·软件需求·海外电商系统开发