You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于脚本对嵌套字段执行简单(非嵌套)多字段聚合的疑问

刚好对Elasticsearch嵌套字段的聚合逻辑比较熟悉,来给你梳理清楚~

首先你提到的核心点完全正确:当对开启了include_in_parent的嵌套字段执行非嵌套聚合时,每个桶统计的是父文档(该嵌套字段所属的文档)的数量,而非嵌套子文档的数量。

完整的嵌套字段映射示例

我把你给出的映射补全并格式化了,你可以参考:

{
  "properties": {
    "openPort": {
      "type": "nested",
      "include_in_parent": true,
      "properties": {
        "port": {
          "type": "integer"
        },
        "protocol": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        }
      }
    }
  }
}

关键逻辑补充

  • include_in_parent: true 这个参数会把嵌套字段的内容扁平复制一份到父文档的对应字段中,这就是为什么非嵌套聚合会统计父文档数的核心原因——此时聚合是基于父文档里复制过来的字段值来统计的,不会遍历每个嵌套子文档。
  • 如果你的需求是统计嵌套子文档的数量,那必须用nested聚合类型,指定嵌套路径后再做内部聚合。

举个例子,如果你想统计每个端口对应的嵌套子文档数量,聚合请求应该这么写:

{
  "aggs": {
    "nested_ports": {
      "nested": {
        "path": "openPort"
      },
      "aggs": {
        "port_counts": {
          "terms": {
            "field": "openPort.port"
          }
        }
      }
    }
  }
}

这个请求会逐个遍历openPort下的子文档,统计每个端口出现的子文档次数,和非嵌套聚合的统计对象完全不同。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:34:53