基于脚本对嵌套字段执行简单(非嵌套)多字段聚合的疑问
刚好对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
相关产品推荐
相关产品推荐

