• Elasticsearch 分布式搜索——聚合


    1.聚合的种类

    聚合常见的有三类:

    • **桶(Bucket)**聚合:用来对文档做分组

      • TermAggregation:按照文档字段值分组,例如按照品牌值分组、按照国家分组
      • Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组
    • **度量(Metric)**聚合:用以计算一些值,比如:最大值、最小值、平均值等

      • Avg:求平均值
      • Max:求最大值
      • Min:求最小值
      • Stats:同时求max、min、avg、sum等
    • **管道(pipeline)**聚合:其它聚合的结果为基础做聚合

    **注意:**参加聚合的字段必须是keyword、日期、数值、布尔类型

    2.Bucket聚合语法

    语法如下:

    GET /hotel/_search
    {
      "size": 0,  // 设置size为0,结果中不包含文档,只包含聚合结果
      "aggs": { // 定义聚合
        "brandAgg": { //给聚合起个名字
          "terms": { // 聚合的类型,按照品牌值聚合,所以选择term
            "field": "brand", // 参与聚合的字段
            "size": 20 // 希望获取的聚合结果数量
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    结果:
    在这里插入图片描述

    3.聚合结果排序

    默认情况下,Bucket聚合会统计Bucket内的文档数量,记为_count,并且按照_count降序排序。

    我们可以指定order属性,自定义聚合的排序方式:

    GET /hotel/_search
    {
      "size": 0, 
      "aggs": {
        "brandAgg": {
          "terms": {
            "field": "brand",
            "order": {
              "_count": "asc" // 按照_count升序排列
            },
            "size": 20
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    结果:
    在这里插入图片描述

    4.限定聚合范围

    默认情况下,Bucket聚合是对索引库的所有文档做聚合,但真实场景下,用户会输入搜索条件,因此聚合必须是对搜索结果聚合。那么聚合必须添加限定条件。

    我们可以限定要聚合的文档范围,只要添加query条件即可:

    GET /hotel/_search
    {
      "query": {
        "range": {
          "price": {
            "lte": 200 // 只对200元以下的文档聚合
          }
        }
      }, 
      "size": 0, 
      "aggs": {
        "brandAgg": {
          "terms": {
            "field": "brand",
            "size": 20
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    5.Metric聚合语法

    我们对酒店按照品牌分组,形成了一个个桶。现在我们需要对桶内的酒店做运算,获取每个品牌的用户评分的min、max、avg等值。

    这就要用到Metric聚合了,例如stat聚合:就可以获取min、max、avg等结果。

    语法如下:

    GET /hotel/_search
    {
      "size": 0, 
      "aggs": {
        "brandAgg": { 
          "terms": { 
            "field": "brand", 
            "size": 20
          },
          "aggs": { // 是brands聚合的子聚合,也就是分组后对每组分别计算
            "score_stats": { // 聚合名称
              "stats": { // 聚合类型,这里stats可以计算min、max、avg等
                "field": "score" // 聚合字段,这里是score
              }
            }
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述

  • 相关阅读:
    保洁企业怎么实施智能软件增加客户的互动
    repo status过滤项目
    Python+pandas编写命令行脚本操作excel的小tips
    pandas使用pd.DateOffset生成时间偏移量、把dataframe数据中的时间数据列统一相减N天、缩小、向前偏移N天
    PCF+fluentUI开发组件并导入Microsoft Power Platform Power App
    java的8种基本数据类型-附取值范围的计算逻辑
    初学者必读:如何使用 Nuxt 中间件简化网站开发
    交互与前端3 前端需求简单梳理
    《Spring入门基础》
    19.Chain of Responsibility职责链(行为型模式)
  • 原文地址:https://blog.csdn.net/qq_41296039/article/details/132643204