如何查询内部对象中的Elasticsearch嵌套文档?

时间:2017-10-18 15:09:43

标签: elasticsearch elasticsearch-5

我正在尝试过滤Elasticsearch查询(ES 5.6.2)中nested document内的字段。嵌套文档本身是主文档内部对象中的一个字段。映射看起来像这样:

{
    "mappings": {
        "container": {
            "properties": {
                "host": {
                    "properties": {
                        "tags_nested": {
                            "type": "nested",
                            "properties": {
                                "tag_key": {
                                    "type": "keyword"
                                },
                                "tag_val": {
                                    "type": "keyword"
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

我想过滤host.tags_nested.tag_keys,但我无法找到正确的语法来访问tags_nested内部对象中的嵌套host文档。我尝试了以下查询,当我知道有一些应该匹配时,它不会返回任何结果:

{
    "query": {
        "nested": {
            "path": "host.tags_nested",
            "query": {
                "bool": {
                    "filter": [
                        {
                            "term": {
                                "host.tags_nested.tag_key": "example_key"
                            }
                        }
                    ]
                }
            }
        }
    }
}

根据ES docs,您可以通过传递与嵌套文档的字段名称相对应的nested来执行path查询以在嵌套文档中进行查询。但是当path在内部对象中并且需要使用点表示法访问时,这似乎不起作用。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

试试这个。 Term Query会搜索我们指定的确切字词。因此,对于该用途fieldname.keyword,因为关键字在我们索引它们时会存储精确的文本。

{
    "query": {
        "nested": {
            "path": "host.tags_nested",
            "query": {
                "bool": {
                    "filter": [
                        {
                            "term": {
                                "host.tags_nested.tag_key.keyword": "example_key"
                            }
                        }
                    ]
                }
            }
        }
    }
}