聚合查询

在我们使用Mysql进行查询时,常常会使用group by 指令将数据进行分组,配合聚合函数,可以将其中的数据进行统计操作,在Elasticsearch中也有这样的操作,
并且其聚合统计的能力比mysql更加强大,它甚至可以将分组后的数据再次往下分组,并且统计聚合的方式多种多样。

ps: Elaticsearch版本为6.8.6

创建索引与添加数据

创建索引
PUT user_info
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
    
  },
  "mappings": {
     // _doc 字段在elasticsearch 7.x 已删除
    "_doc":{
      
      "properties": {
       
      "id": {"type": "integer"},
       // 生日
      "birthDate": {"type": "date"},
      // 用户名
      "userName": {"type": "text"},
      // 部门id
      "deptId": {"type": "integer"},
      // 部门名称
      "deptName": {"type": "text"},
      // 性别   1 表示男  0 表示女  
       "sex": {"type": "integer"},
       // 年龄
       "age": {"type": "integer"}
    }
    
    }
  }
}
填充数据

es 根据list长度聚合排序 es聚合多个字段_数据

聚合查询

在Elasticsearch中,将同一分组的数据称为,并且桶中的数据还可以根据不同的条件再次细分为不同类型的

统计部门人数
GET /user_info/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "deptCount": {
      "terms": {
        "field": "deptId"
      }
    }
  }
}

响应结果

es 根据list长度聚合排序 es聚合多个字段_es 根据list长度聚合排序_02

聚合统计各部门下的男女分布
GET /user_info/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "deptCount": {
      "terms": {
        "field": "deptId"
      },
      "aggs": {
        "sexGroup": {
          "terms": {
            "field": "sex"
          }
        }
      }
    }
  }
}

响应结果

es 根据list长度聚合排序 es聚合多个字段_大数据_03

时间戳聚合统计

在Elasticserch中,我们常用时间戳的形式来存储时间,使用时间戳的优点在于可以提升查询效率,缺点就是不是很直观。在Elasticsearch中,提供了基于时间戳的形式来进行聚合查询,即date_histogram

创建索引
# 考勤信息的索引
PUT check_info
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
    
  },
  "mappings": {
    "_doc":{
      
      "properties": {
       // 指定时间戳类型为date,或者long
       // 指定date类型,可以在聚合时自动格式化为yy-MM-dd类型,而制定long类型则不行
      "checkDateTime": {"type": "date"},
      "userName": {"type": "text"}
    }
    
    }
  }
}
填充数据
PUT check_info/_doc/1
{
   // 2023-06-01 15:54:25
  "checkDateTime": 1685606065000,
  "userName": "张三"
}


PUT check_info/_doc/2
{
    // 2023-06-02 15:54:25
  "checkDateTime": 1685692465000,
  "userName": "李四"
}

PUT check_info/_doc/3
{
      // 2023-06-02 18:54:25
  "checkDateTime": 1685703265000,
  "userName": "王五"
}
按天统计
GET /check_info/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "dateGroup": {
      "date_histogram": {
        "field": "checkDateTime",
        "interval": "day"
      }
    }
  }
  
}

响应结果

es 根据list长度聚合排序 es聚合多个字段_搜索引擎_04

在响应结果中我们可以发现Elasticsearch是根据日期从前到后的依次统计,即使我们没有指定查询的日期范围

按月统计
GET /check_info/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "dateGroup": {
      "date_histogram": {
        "field": "checkDateTime",
        // 通过设置该值可进行统计范围的确定
        "interval": "month"
      }
    }
  }
}

响应结果

es 根据list长度聚合排序 es聚合多个字段_搜索引擎_05

小结

以上是一些在开发工作中遇到的聚合数据类型,其实Elasticsearch提供了非常强大的聚合能力,
聚合API-v6.8.6,可参考文档查看更多的聚合方式