Elasticsearch聚合 -聚合入门

聚合查询

在我们使用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"}
    }
    
    }
  }
}
填充数据

在这里插入图片描述

聚合查询

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

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

响应结果
在这里插入图片描述

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

响应结果
在这里插入图片描述

时间戳聚合统计

在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"
      }
    }
  }
  
}

响应结果
在这里插入图片描述

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

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

响应结果
在这里插入图片描述

小结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值