聚合查询
在我们使用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,可参考文档查看更多的聚合方式