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

相关推荐
艾迪的技术之路4 分钟前
redisson使用lock导致死锁问题
java·后端·面试
mmoyula5 分钟前
【RK3568 驱动开发:实现一个最基础的网络设备】
android·linux·驱动开发
今天背单词了吗98022 分钟前
算法学习笔记:8.Bellman-Ford 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·开发语言·后端·算法·最短路径问题
天天摸鱼的java工程师25 分钟前
使用 Spring Boot 整合高德地图实现路线规划功能
java·后端
东阳马生架构40 分钟前
订单初版—2.生单链路中的技术问题说明文档
java
sam.li1 小时前
WebView安全实现(一)
android·安全·webview
咖啡啡不加糖1 小时前
暴力破解漏洞与命令执行漏洞
java·后端·web安全
风象南1 小时前
SpringBoot敏感配置项加密与解密实战
java·spring boot·后端
DKPT1 小时前
Java享元模式实现方式与应用场景分析
java·笔记·学习·设计模式·享元模式