(九):ElasticSearch聚合查询(Aggregation aggs)

  聚合查询文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.4/search-aggregations.html

  聚合查询与Mysql中的 group by 类似,可以实现对数据统计、分析。如热点商品、销量等信息。

  ElasticSearch实现这些统计功能的比数据库的sql要方便的多,而且查询速度非常快,可以实现实时搜索效果。

  聚合查询的语法规则:

"aggregations" : {
    "<aggregation_name>" : {
        "<aggregation_type>" : {
            <aggregation_body>
        }
        [,"meta" : {  [<meta_data_body>] } ]?
        [,"aggregations" : { [<sub_aggregation>]+ } ]?
    }
    [,"<aggregation_name_2>" : { ... } ]*
}

1、基本概念

  Elasticsearch中的聚合,包含多种类型,最常用的两种,一个叫 `桶`,一个叫 `度量`:

1.1、bucket - 桶(分组)

  按照某种方式对数据进行分组,每一组数据在ES中称为一个"桶"。如按照年龄段对人进行划分:0~10,10~20,20~30,30~40等。

  Elasticsearch中提供了很多划分桶的方式,这里列举部分划分桶的方式。如:

Date Histogram Aggregation

日期阶梯分组,如给定阶梯为月,会自动每月分为一组

Histogram Aggregation

数值阶梯分组

Terms Aggregation

根据词条内容分组,词条内容完全匹配的为一组

Range Aggregation

数值和日期的范围分组,指定开始和结束,然后按段分组

  bucket aggregations 只负责对数据进行分组,不会进行计算。若要获得统计的数据,bucket中需要嵌套另一种聚合,metrics aggregations 即度量。

1.2、metrich - 度量(运算)

  bucket aggregations分组完成后,会对组中的数据进行聚合运算,例如求平均值、最大、最小、求和等,这些处理在ES中称为 metrich 度量。常见的度量聚合方式:

Avg Aggregation

平均值

Max Aggregation

最大值

Min Aggregation

最小值

Percentiles Aggregation

百分比

Stats Aggregation

同时返回avg、max、min、sum、count等

Sum Aggregation

求和

Top hits Aggregation

求前几

Value Count Aggregation

求总数

2、聚合案例

2.1、搜索address中包含Street的所有人的年龄分布及平均年龄

# 搜索address中包含Street的5个人的年龄分布及平均年龄
GET /items/_search
{
  "query": {
    "match": {
      "address": "Street"
    }
  },
  "aggs": {
    "ageAgg": {
      "terms": {
        "field": "age",
        "size": 3
      }
    },
    "ageAvg":{
      "avg": {
        "field": "age"
      }
    }
  },"size": 0
}

  按照年龄聚合,并计算所有人的年龄分布,聚合时会显示满足条件的记录,size设置为0,就不会显示记录。

0

2.2、搜索各年龄段的平均薪资

# 按 age 聚合,获取各年龄段的平均工资
GET /items/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "ageAgg": {
      "terms": {
        "field": "age",
        "size": 3
      }, 
      "aggs": {
        "balanceAvg": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  },"size": 0
}

2.3、查出所有年龄分布,并且这些年龄段中M的平均薪资和F的平均薪资以及这个年龄段的总体平均薪资

# 查出所有年龄分布,并且这些年龄段中M的平均薪资和F的平均薪资以及这个年龄段的总体平均薪资
GET /items/_search
{
  "query": {
    "match_all": {}
  }, 
  "aggs": {
    "ageAgg": {
      "terms": {
        "field": "age",
        "size": 2
      },
      "aggs": {
        "genderAgg": {
          "terms": {
            "field": "gender.keyword",
            "size": 2
          },
          "aggs": {
            "genderBalanceAvg": {
              "avg": {
                "field": "balance"
              }
            }
          }
        }
        ,"ageBalanceAvg": {
            "avg": {
              "field": "balance"
            }
          }
      }
    }
  }, "size": 0
}

 

posted @ 2024-01-18 17:12  无虑的小猪  阅读(73)  评论(0编辑  收藏  举报