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

相关推荐
Tisfy17 小时前
LeetCode 1927.求和游戏:抵消+看最值
java·leetcode·游戏·题解·博弈论
Elastic 中国社区官方博客21 小时前
搜索倍增器:推动收入、生产力和 AI 实现规模化
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
小成很成1 天前
mysql 8.0.21 升级 mysql 8.0.45(经过生产环境验证)
android·mysql·adb
秋饼1 天前
JDK 27 企业级 AI 服务落地实战:G1 默认、紧凑对象头、后量子 TLS 与 JFR 脱敏全解析
java·ai·技术分享·后端开发
卓怡学长1 天前
w176基于SpringBoot的医院管理系统
java·spring boot·spring·maven·intellij-idea
lemon_sjdk1 天前
ObjectProperty
java·开发语言·算法
hh9501 天前
Agent Plan x DeepSeek Harness:Agent 供应链安全与第三方插件审计
java·开发语言·安全·agent plan·adg成都社区·adg社区
吴声子夜歌1 天前
Java面试——HBase原理及应用
java·面试·hbase
浪兎兎1 天前
【Java Web】Servlet + JSP 笔记
java·前端·servlet
Elasticsearch1 天前
Microsoft Foundry 的 AI agent 可观测性:两个环境变量,无需采集器
elasticsearch