You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Kibana(Elasticsearch v6.2)中过滤聚合结果?

解决Kibana v6.2中过滤聚合结果(类似SQL HAVING)的问题

刚好在Kibana 6.x版本处理过一模一样的需求,先给你理清核心问题:你用的post_filter确实不对路子——它是在聚合计算完成后过滤原始文档,只会影响Discover里显示的具体条目,完全不会改变聚合生成的桶结果。要实现SQL里HAVING那种“过滤聚合后结果”的效果,有两种实用方案:

方案一:在Visualize可视化中直接配置(最推荐)

这是无需写代码的可视化操作方式,适合快速生成符合要求的图表:

  • 打开Kibana的Visualize页面,创建/编辑一个聚合类图表(比如柱状图、条形图都可以)
  • 先搭好基础聚合:
    • 先加一个Bucket聚合(比如Terms聚合,按你需要分组的字段,比如project.keyword
    • 再添加一个Metric聚合(比如Sum,计算hours字段的总和,给这个聚合起个好认的名字,比如total_hours
  • 关键步骤:添加Pipeline聚合,选择Bucket Selector
  • 配置Bucket Selector:
    • Buckets Path里,把刚才的Sum聚合(比如total_hours)映射成一个参数,比如total
    • Script里写过滤条件:params.total > 100
  • 保存配置后刷新图表,就能看到只有sum of hours超过100的分组被展示出来了

方案二:编写Elasticsearch DSL查询(适合复杂场景)

如果可视化配置满足不了你的复杂需求,比如多条件过滤或者嵌套聚合,直接写DSL更灵活:

举个例子,假设你要按user.keyword分组,过滤sum(hours) > 100的桶,DSL代码如下:

{
  "size": 0,
  "aggs": {
    "group_by_user": {
      "terms": {
        "field": "user.keyword"
      },
      "aggs": {
        "total_hours": {
          "sum": {
            "field": "hours"
          }
        },
        "filter_hours_threshold": {
          "bucket_selector": {
            "buckets_path": {
              "total": "total_hours"
            },
            "script": "params.total > 100"
          }
        }
      }
    }
  }
}

你可以先在Dev Tools里执行这段DSL,确认结果符合预期,然后在Visualize中选择「Custom Query」,粘贴这段代码就能生成对应的图表了。

小提醒

  • 确认你的Elasticsearch和Kibana都是6.2版本,Bucket Selector聚合在6.x已经正式支持
  • 如果脚本执行报错,检查下Elasticsearch的script.allowed_types配置,确保允许inline脚本(默认是开启的,除非你改过全局配置)

内容的提问来源于stack exchange,提问作者Enayat

火山引擎 最新活动