Elasticsearch中的聚合查询

📅 发布时间:2026/9/30 16:35:03
Elasticsearch中的聚合查询
前置知识DSL 结构query先筛选文档 →aggs做统计size:0不返回原始文档字段类型指标聚合int/double/long数值字段terms 分组必须keywordtext 不能直接分组两个概念区分Metric对文档算值sum/avg/min/max/stats/cardinality/value_countBucket把文档分到不同桶分组terms、date_histogram、range、filter、missingMetric 指标聚合只算统计值不分桶。1、value_count统计该字段有值的个数多值字段会统计每一个值不是只算文档 1 次。可以直接使用的类型数值类、日期类、布尔、IP、地理text默认不能直接跑 value_count。注意null / 不存在字段 → 不计入文档存在但price:null或者文档没有 price 字段 → value_count 不计数。多值字段数组例如tags: [a,b]这条文档会贡献2到 value_count不是 1例如查看price不为空的个数2、min/max/sum/avg 单独指标单独计算最小值、最大值、和及平均数。3、stats展示所有指标显示数量、最大、最小、和、平均数4、cardinality近似去重 count近似值不是精确统计。Bucket 桶聚合类似于mysql中的group by对查询结果进行分桶。桶聚合产出多个桶每个桶里有一批文档桶可以嵌套子聚合。1、terms-按指定字段分桶按指定字段分桶按字段原始精确值分组要求字段生成「词条」默认不能直接对 text 分词字段做 terms。按商品类型进行分桶2、date_histogram-按固定时间间隔分桶按时间分桶作用于date/date_nanos类型字段有两种区间calendar_interval 日历区间推荐自然时间自动适配日历规则月份天数不同、闰年、夏令时可选值year/quarter/month/week/day/hour/minute/secondfixed_interval 固定毫秒时长固定时长一天永远 24h不受月份、夏令时影响单位ms毫秒、s秒、m分、h小时、d天参数列表参数说明field必填必须是 date 类型字段例如product 表createtimecalendar_interval/fixed_interval二选一时间粒度format格式化 key_as_stringyyyy-MM-dd方便前端展示min_doc_count桶内最少文档数。默认 1设 0没有数据的时间段也返回桶count0时序图表必备time_zone时区ES 内部存 UTC中国时区写08:00或Asia/Shanghai分桶按北京时间extended_bounds扩展时间范围强制生成起止区间内的空桶不是过滤过滤写在 query 里offset时间偏移微调桶起始点例如8h按创建日期分桶创建时间按月分桶3、range-按自定义返回分桶按指定范围分桶支持数值range及日期类型(date_range)方便自定义桶区间。[from,to)按价格区间分桶(−∞-\infty−∞,1000)、[1000,5000)、[5000,∞\infty∞)按日期区间:4、missing-按缺失字段分桶统计【某个字段缺失】的文档全部放到单独一个桶里文档中没有这个字段或字段值为null。字符串“”不能算缺失。新增一条没有lv字段的文档查询缺失lv数据。嵌套子聚合聚合查询支持嵌套在哪个桶下面嵌套就在对应的桶名称里面写aggs。按type分桶后再按lv分桶按type分桶后再按lv分桶再统计每个桶内的价格指标Pipeline 管道聚合管道聚合不是直接扫描原始文档而是拿【前面桶聚合的结果】做二次计算。两类Sibling 兄弟管道聚合和目标聚合平级输出单独结果不修改原桶。比如stats_bucket、sum_bucket、avg_bucketParent 父管道聚合写在父聚合内部改造原有桶往桶里新增计算字段。比如derivative导数 / 环比、moving_avg(移动平均)、cumulative_sum(累计求和)1、Parent 父管道聚合1、cumulative_sum-累计求和再分桶结果中添加累计和。2、derivative 导数计算当前桶 - 上一个桶适合看环比增长量3、moving_fn /moving_avg 移动平均滑动窗口取最近 N 个桶平均值平滑时序曲线。创建时间按月分桶计算每个桶的总价添加最近3个桶的平均值4、bucket_selector 桶选择器只保留符合条件的桶不满足条件的桶直接剔除注意只是过滤聚合结果不会过滤原始文档示例只保留月总价格 4000 的月份桶5、bucket_sort 桶排序对已经分好的 buckets 排序、截取 topN不是原始文档排序示例按商品类别分桶按总价降序取前二2、Sibling 兄弟管道聚合放在和上游桶聚合同一级不是写在桶里面。1、sum_bucket所有桶的指标总和示例按月分桶每个月 sum 价格再用 sum_bucket 求全部月份总和2、avg_bucket / max_bucket / min_bucket / stats_bucket /用法完全一样avg_bucket所有桶指标的平均值max_bucket找出指标最大的桶返回 key 和 valuemin_bucket找出指标最小的桶stats_bucket一次性返回 sum、avg、min、max、count示例找出总价最高的产品类别