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

相关推荐
Sayai4 小时前
Elasticsearch Rollup 汇算索引实战:监控指标多粒度预聚合查询,附 painless 时间窗取每日最新值
大数据·运维·elasticsearch·搜索引擎·性能优化·监控
步行cgn5 小时前
Spring MVC POST 请求乱码:原因与完整解决方案
java·spring·mvc
y1su5 小时前
Leetcode 链表,树,回溯 模板
java·leetcode·链表
qianyuqiye15 小时前
K8s 命名空间与 Pod 入门:从概念到实战
java·docker·kubernetes
牧瀬クリスだ5 小时前
观察者模式:一个对象变化,一群对象自动响应
java·观察者模式·设计模式
小张成长计划..5 小时前
【Linux】26:线程互斥和同步
java·开发语言
邪修king8 小时前
Re:Linux 系统篇(三十五):进程间通信Chapter2:从匿名管道到进程池:Linux 进程间通信实战(深度理解「先描述,再组织」)
java·linux·运维
拆房老料8 小时前
【第四部分:Agentic 智能体设计模式】16. 一个 Prompt 搞不定复杂任务?试试 Prompt Chaining
java·前端·人工智能·设计模式·prompt
张张123y9 小时前
后端第十四课:Agent 记忆系统(让 Agent 记住上下文和用户,跨会话不健忘)
java·大数据·人工智能·python·agent·记忆
曹牧13 小时前
C#:空合并运算符
java·前端·数据库