Elasticsearch(三)聚合基本使用

基础概念

bucket

数据分组,一些数据按照某个字段进行bucket划分,这个字段值相同的数据放到一个bucket中。可以理解成Java中的Map<String, List>结构,类似于Mysql中的group by后的查询结果。

metric:

对一个数据分组执行的统计,比如计算最大值,最小值,平均值等 类似于Mysql中的max(),min(),avg()函数的值,都是在group by后使用的。

案例

以如下文档结构为例:

{
  "_index" : "zb_notice",
  "_type" : "_doc",
  "_id" : "4451224572914342308301065",
  "_score" : 1.0,
  "_source" : {
    "_class" : "NoticeEntity",
    "id" : "111",
    "url" : "https://xxxxxx/purchaseNotice/view/111?",
    "owner" : "河管养所",
    "procurementName" : "工程建筑",
    "procurementNameText" : "应急抢险配套工程建筑",
    "intermediaryServiceMatters" : "无(属于非行政管理的中介服务项目采购)",
    "investmentApprovalProject" : "是",
    "code" : "789456",
    "scale" : 3.167183E8,
    "scaleText" : "投资额(¥316,718,300.00元)",
    "area" : "",
    "requiredServices" : "工程建筑",
    "typeCodes" : [
      "021"
    ],
    "context" : "是一座具有灌溉 、供水 、排洪 、交通和挡潮蓄淡等多功能的大(2)型水闸工程,承担黄冈河下游 8.65 万亩农田的灌溉任务并",
    "timeLimit" : "具体时限以合同条款约定为准。",
    "amount" : 0.0,
    "amountText" : "暂不做评估与测算",
    "amountDescription" : "",
    "selectIntermediaryType" : "直接选取",
    "isChooseIntermediary" : "否",
    "isAvoidance" : "否",
    "endTime" : "2023-09-04 09:30:00",
    "startTime" : "2023-08-31",
    "files" : [
      {
        "fileName" : "东溪水闸初设批复(1).pdf",
        "url" : "/aa/bb/file/downloadfile/PjAttachment/123456"
      }
    ]
  }
}

统计服务类型最多公告

GET zb_notice/_search
{
  "size": 0,
  "aggs": {
    "song_qty_by_language": {
      "terms": {
        "field": "requiredServices"
      }
    }
  }
}

语法解释:

  • size:0 表示只要统计后的结果,原始数据不展现
  • aggs:固定语法 ,聚合分析都要声明aggs
  • song_qty_by_language:聚合的名称,可以随便写,建议规范命名
  • terms:按什么字段进行分组
  • field:具体的字段名称

响应结果如下:

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 5,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "song_qty_by_language": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "doc_count": 5
        }
      ]
    }
  }
}

语法解释:

  • hits: 由于请求时设置了size:0,hits就是空的
  • aggregations:聚合查询的结果
  • song_qty_by_language:请求时声明的名称
  • buckets:根据指定字段查询后得到的数据分组集合,[]内的是每一个数据分组,其中key为每个bucket的对应指定字段的值,doc_count为统计的数量。

默认按doc_count降序排序。

按服务分类的平均服务价格

GET zb_notice/_search
{
  "size": 0,
  "aggs": {
    "lang": {
      "terms": {
        "field": "requiredServices"
      },
      "aggs": {
        "length_avg": {
          "avg": {
            "field": "amount"
          }
        }
      }
    }
  }
}

这里为两层aggs聚合查询,先按服务类型统计,得到数据分组,再在数据分组里算平均价格。

多个aggs嵌套语法也是如此,aggs代码块的位置即可。

统计最多服务费、最少服务费等的公告

最常用的统计:count,avg,max,min,sum,语法含义与mysql相同。

GET zb_notice/_search
{
  "size": 0,
  "aggs": {
    "color": {
      "terms": {
        "field": "requiredServices"
      },
      "aggs": {
        "length_avg": {
          "avg": {
            "field": "amount"
          }
        },
        "length_max": {
          "max": {
            "field": "amount"
          }
        },
        "length_min": {
          "min": {
            "field": "amount"
          }
        },
        "length_sum": {
          "sum": {
            "field": "amount"
          }
        }
      }
    }
  }
}

按上架日期分段统计服务类型数量

按月统计

date histogram与histogram语法类似,搭配date interval指定区间间隔 extended_bounds表示最大的时间范围。

复制代码GET zb_notice/_search
{
  "size": 0,
  "aggs": {
    "sales": {
      "date_histogram": {
        "field": "publishTime",
        "interval": "month",
        "format": "yyyy-MM-dd",
        "min_doc_count": 0,
        "extended_bounds": {
          "min": "2023-01-01",
          "max": "2023-12-31"
        }
      }
    }
  }
}

interval的值可以天、周、月、季度、年等。可以延伸一下

GET zb_notice/_search
{
  "size": 0,
  "aggs": {
    "sales": {
      "date_histogram": {
        "field": "publishTime",
        "interval": "quarter",
        "format": "yyyy-MM-dd",
        "min_doc_count": 0,
        "extended_bounds": {
          "min": "2019-01-01",
          "max": "2019-12-31"
        }
      },
      "aggs": {
        "lang_qty": {
          "terms": {
            "field": "requiredServices"
          },
          "aggs": {
            "like_sum": {
              "sum": {
                "field": "amount"
              }
            }
          }
        },
        "total" :{
          "sum": {
            "field": "amount"
          }
        }
      }
    }
  }
}

带上过滤条件

聚合查询可以和query搭配使用,相当于mysql中where与group by联合使用

查询条件
GET zb_notice/_search
{
  "size": 0,
  "query": {
    "match": {
      "requiredServices": "工程咨询"
    }
  },
  "aggs": {
    "sales": {
      "terms": {
        "field": "requiredServices"
      }
    }
  }
}
过滤条件
GET zb_notice/_search
{
  "size": 0,
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "requiredServices": "工程咨询"
        }
      }
    }
  },
  "aggs": {
    "sales": {
      "terms": {
        "field": "requiredServices"
      }
    }
  }
}
相关推荐
努力的布布6 分钟前
Elasticsearch-模糊查询
大数据·elasticsearch·搜索引擎
m0_748237052 小时前
Monorepo pnpm 模式管理多个 web 项目
大数据·前端·elasticsearch
java1234_小锋3 小时前
ElasticSearch如何做性能优化?
大数据·elasticsearch·性能优化
LI JS@你猜啊14 小时前
Elasticsearch 集群
大数据·服务器·elasticsearch
神奇侠202418 小时前
解决集群Elasticsearch 未授权访问漏洞
elasticsearch
Elastic 中国社区官方博客18 小时前
如何通过 Kafka 将数据导入 Elasticsearch
大数据·数据库·分布式·elasticsearch·搜索引擎·kafka·全文检索
神奇侠202418 小时前
解决单台Elasticsearch 未授权访问漏洞
elasticsearch
nece00118 小时前
elasticsearch 杂记
大数据·elasticsearch·搜索引擎
开心最重要(*^▽^*)18 小时前
Es搭建——单节点——Linux
大数据·elasticsearch
喝醉酒的小白21 小时前
ElasticSearch 的核心功能
大数据·elasticsearch·jenkins