过滤器在 elasticsearch 中嵌套字段的非嵌套聚合中不起作用

时间:2021-05-28 11:50:23

标签: elasticsearch filter nested aggregation

我有以下 ES 映射(使用 ES 5.7.6)

{
"properties": {
    "machine": {
        "properties": {
            "name": {
                "type": "keyword"
            },
            "networkInterface": {
                "type": "nested",
                "include_in_parent": true,
                "macAddress": {
                    "type": "keyword"
                },
                "name": {
                    "type": "text",
                    "fields":{
                       "raw":{
                          "type":"keyword"
                       }
                    }
                }
            }
        }
    }
}

我需要以下 - 获取嵌套字段术语的机器数(父文档),对嵌套字段使用过滤器。

为了实现它,我在 networkInterface.name 上构建了一个过滤的、非嵌套的聚合。 但过滤器似乎不适用。返回的术语包括那些与过滤器不匹配的术语。

请帮助我理解为什么会出现这种行为,以及是否有办法在 ES 中实现要求。 我尝试过以下操作 -

  1. “networkInterface.name”上的非嵌套过滤术语聚合具有嵌套过滤器。
"aggregations": {
        "filtered": {
            "filter": {
                "bool": {
                    "must": [
                        {
                            "nested": {
                                "query": {
                                    "term": {
                                        "networkInterface.name.raw": "Intel(R) 12345L"
                                    }
                                },
                                "path": "networkInterface",
                                "ignore_unmapped": false,
                                "score_mode": "none",
                                "boost": 1.0
                            }
                        }
                    ]
                }
            },
            "aggregations": {
                "interfaceNames": {
                    "terms": {
                        "field": "networkInterface.name.raw",
                        "size": 1000,
                        "min_doc_count": 1,
                        "shard_min_doc_count": 0,
                        "show_term_doc_count_error": false,
                        "order": [
                            {
                                "_count": "desc"
                            },
                            {
                                "_term": "asc"
                            }
                        ]
                    }
                }
            }
        }
    }
  1. “networkInterface.name”上的非嵌套过滤术语聚合这具有非嵌套过滤器。
        "filtered": {
            "filter": {
                "bool": {
                    "must": [
                        {
                            "term": {
                                "networkInterface.name.raw": "Intel(R) 12345L"
                            }
                        }
                    ],
                    "adjust_pure_negative": true,
                    "boost": 1.0
                }
            },
            "aggregations": {
                "interfaceNames": {
                    "terms": {
                        "field": "networkInterface.name.raw",
                        "size": 1000,
                        "min_doc_count": 1,
                        "shard_min_doc_count": 0,
                        "show_term_doc_count_error": false,
                        "order": [
                            {
                                "_count": "desc"
                            },
                            {
                                "_term": "asc"
                            }
                        ]
                    }
                }
            }
        }
    }

两者都返回相同的结果。我只发布了整个查询的“聚合”部分,上述两种情况下的“查询”是相同的。

1 个答案:

答案 0 :(得分:0)

运行非嵌套聚合时,嵌套上下文丢失,过滤器对聚合桶没有影响。这个结论是基于对多个查询的尝试。

相关问题