Elasticsearch教程(6) ES桶聚合Query DSL-Terms Aggregation


桶聚合的种类很多,一篇短文难以覆盖,这篇先介绍Terms Aggregation(按字段分组),类似MySQL中的Group By,它是最常用的聚合方式。注意用于聚合的字段不能是text类型。

1 准备测试数据

1.1 插入数据DSL

PUT /user/_doc/1
{
    "id":"1",
    "name":"张一",
    "dept":"web",
    "path":"dept1,man1",
    "birthday": "2008-11-16",
    "status":"1"
}

PUT /user/_doc/2
{
    "id":"2",
    "name":"张二",
    "dept":"web",
    "path":"dept1,man2",
    "birthday": "2008-12-17",
    "status":"1"
}

PUT /user/_doc/3
{
    "id":"3",
    "name":"张三",
    "dept":"web",
    "path":"dept1,man3",
    "birthday": "2009-10-10",
    "status":"1"
}

PUT /user/_doc/4
{
    "id":"4",
    "name":"李四",
    "dept":"java",
    "path":"dept2,man4",
    "birthday": "2012-01-01",
    "status":"1"
}

PUT /user/_doc/5
{
    "id":"5",
    "name":"王五",
    "dept":"java",
    "path":"dept2,man5",
    "birthday": "2012-07-01",
    "status":"0"
}

PUT /user/_doc/6
{
    "id":"6",
    "name":"王六",
    "dept":"data",
    "status":"0",
    "path":"dept3,man6",
    "birthday": "2009-12-12",
    "gender":"man"
}

1.2 表格展示

idnamebirthdaygenderdeptpathstatus
1张一2008-11-16webdept1,man11
2张二2008-12-17webdept1,man21
3张三2009-10-10webdept1,man31
4李四2012-01-01javadept2,man41
5王五2012-07-01javadept2,man50
5王六2009-12-12mandatadept3,man60

2 Terms Aggregation(根据字段的值分组)

Terms聚合用于分组

2.1 根据dept分组,求每个部门的数量

2.1.1 SQL

#=======group by=======
POST /_xpack/sql?format=txt
{
  "query": "SELECT dept, COUNT(*) num FROM user GROUP BY dept" 
}
    dept       |      num      
---------------+---------------
data           |1              
java           |2              
web            |3              

2.1.2 DSL

GET /user/_doc/_search
{
    "size":0,
    "aggs":{
        "depts":{
            "terms":{
                "field":"dept.keyword"
            }
        }
    }
}
  "aggregations" : {
    "depts" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "web",
          "doc_count" : 3
        },
        {
          "key" : "java",
          "doc_count" : 2
        },
        {
          "key" : "data",
          "doc_count" : 1
        }
      ]
    }
  }

2.2 根据dept分组,求每个部门的数量,并排序

2.2.1 SQL

POST /_xpack/sql?format=txt
{
    "query": "SELECT dept, COUNT(*) num FROM user GROUP BY dept ORDER BY num DESC" 
}
     dept      |      num      
---------------+---------------
web            |3              
java           |2              
data           |1              

2.2.2 DSL

GET /user/_doc/_search
{
    "size":0,
    "aggs":{
        "depts":{
            "terms":{
                "field":"dept.keyword",
                "order" : { "_count" : "desc" }
            }
        }
    }
}

上面按照数量降序,如果将"_count"改成"_key",就是按照key(这里就是指dept)降序

  "aggregations" : {
    "depts" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "web",
          "doc_count" : 3
        },
        {
          "key" : "java",
          "doc_count" : 2
        },
        {
          "key" : "data",
          "doc_count" : 1
        }
      ]
    }
  }

2.3 对统计结果过滤,加having

2.3.1 SQL

POST /_xpack/sql?format=txt
{
    "query": "SELECT dept, COUNT(*) num  FROM user GROUP BY dept HAVING num > 1 ORDER BY num DESC" 
}

过滤出数量>1的部门

     dept      |      num      
---------------+---------------
web            |3              
java           |2              

2.3.2 SQL转DSL语句

POST /_xpack/sql/translate
{
    "query": "SELECT dept, COUNT(*) num  FROM user GROUP BY dept HAVING num > 1 ORDER BY num DESC" 
}

2.4 过滤需统计文档的范围

2.4.1 SQL

POST /_xpack/sql?format=txt
{
    "query": "SELECT dept, COUNT(*) num  FROM user  WHERE status = 1 GROUP BY dept ORDER BY num DESC" 
}

2.4.2 DSL

GET /user/_doc/_search
{
    "size":0,
    "query":{
        "term":{
            "status":1
        }
    },
    "aggs":{
        "dept_count":{
            "terms":{
                "field":"dept.keyword",
                "order":{
                    "_count":"desc"
                }
            }
        }
    }
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瑟 王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值