【ES从入门到实战】十七、全文检索-ElasticSearch-进阶-aggregations聚合分析

接第16节

9) 、aggregations (执行聚合)

聚合提供了从数据中分组和提取数据的能力。
最简单的聚合方法大致等于 SQL GROUP BYSQL 聚合函数
在 Elasticsearch 中,您有执行搜索返回 hits (命中结果),并且同时返回聚合结果,
把一个响应中的所有hits(命中结果)分隔开的能力。这是非常强大且有效的,您可以执行查询和多个聚合,
并且在一次使用中得到各自的(任何一个的)返回结果,使用一次简洁和简化的 API 来避免网络往返。

aggregations 查询语法:

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

举个栗子:

  • 搜索address中包含mill的所有人的年龄分布以及平均年龄,但不显示这些人的详情。
GET /bank/_search
{
    
    
  "query": {
    
     //查询
    "match": {
    
    
      "address": "mill"
    }
  },
  "aggs": {
    
     //聚合
    "ageAgg": {
    
     //年龄分布
      "terms": {
    
    
        "field": "age",
        "size": 10 //只取10中聚合的结果
      }
    },
    "ageAvg":{
    
    //平均年龄,基于上一次的结果
      "avg": {
    
    
        "field": "age"
      }
    },
    "balanceAvg":{
    
    //平均薪资
      "avg": {
    
    
        "field": "balance"
      }
    }
  },
  "size": 0 //不显示搜索数据,只显示聚合结果
}

在这里插入图片描述

aggs,执行聚合。聚合语法如下:
"aggs":{
    
    
	"ages_name 这次聚合的名字,方便展示在结果集中":{
    
    
		"AGG-TYPE 聚合的类型(avg,term,terms) ":{
    
    }
	}
}
  • 复杂聚合:按照年龄聚合,并且请求这些年龄段的这些人的平均薪资(使用一个子聚合)
GET /bank/_search
{
    
    
  "query": {
    
    
    "match_all": {
    
    }
  },
  "aggs": {
    
    
    "ageAgg": {
    
    
      "terms": {
    
    //年龄范围分布聚合
        "field": "age",
        "size": 100//返回100中情况
      },
      "aggs": {
    
    //基于ageAgg的结果做聚合
        "ageAvg": {
    
    
          "avg": {
    
    //求balance的平均值
            "field": "balance"
          }
        }
      }
    }
  }
}

在这里插入图片描述

  • 复杂聚合进阶:查出所有年龄分布,并且这些年龄段中M的平均薪资和F的平均薪资以及这个年龄段的总体平均新资
GET /bank/_search
{
    
    
  "query": {
    
    
    "match_all": {
    
    }
  },
  "aggs": {
    
    //聚合
    "ageAgg":{
    
    
      "terms": {
    
    //年龄分布
        "field": "age",
        "size": 100
      },
      "aggs": {
    
    //基于ageAgg做聚合
        "genderAgg": {
    
    //性别分布
          "terms": {
    
    
            //文本字段聚合使用keyword进行精确匹配,否则会报错
            "field": "gender.keyword",
            "size": 10
          },
          "aggs": {
    
    //基于genderAgg做聚合
            "balanceAvg": {
    
    //求性别为M和F的各自的平均薪资
              "avg": {
    
    
                "field": "balance"
              }
            }
          }
        },
        "ageBalanceAvg":{
    
    //基于ageAgg,求各个年龄段的平均薪资
          "avg": {
    
    
            "field": "balance"
          }
        }
      }
    }
  }
}

在这里插入图片描述

更多聚合查询操作,请参考 ES 官方文档:参考文档-search-aggregations

参考文档-query-dsl


参考:

Elasticsearch Reference

elastic

全文搜索引擎 Elasticsearch 入门教程

猜你喜欢

转载自blog.csdn.net/runewbie/article/details/106369301