Elasticsearch-如何使用嵌套字段过滤数据

时间:2018-06-27 07:01:22

标签: elasticsearch

以下是一些带有标签作为嵌套字段的文档。是否可以过滤结果以获取同时具有tags.id = 21tags.id = 22的文档?

{
  "title": "Nokia",
  "tags": [
    {
      "id": 21
    },
    {
      "id": 22
    }
  ]  
}

{
  "title": "HTC",
  "tags": [
    {
      "id": 21
    },
    {
      "id": 23
    }
  ]  
}

{
  "title": "Samsung",
  "tags": [
    {
      "id": 21
    },
    {
      "id": 22
    }
  ]  
}

在这种情况下,结果应返回标题为诺基亚和三星的文档

2 个答案:

答案 0 :(得分:0)

您可以使用布尔查询:

GET my_index/_search
{
    "query": {
        "bool": {
            "filter": [
                {"match": {"tags.id": 21}},
                {"match": {"tags.id": 22}}
            ]
        }
    }
}

答案 1 :(得分:0)

下面是查询中提到的情况的查询

{
    "query": {
        "bool": {
            "filter": [
                {
                    "nested":{
                        "path":"tags",
                        "query":{
                            "bool":{
                                "filter":[
                                    {"term": {"tags.id": 21}}
                                ]
                            }
                        }
                    }
                },
                {
                    "nested":{
                        "path":"tags",
                        "query":{
                            "bool":{
                                "filter":[
                                    {"term": {"tags.id": 22}}
                                ]
                            }
                        }
                    }
                }

            ]
        }
    }
}

我做的错误是将2个匹配块放在同一过滤器块下。

"filter":[
    {"term": {"tags.id": 21}},
    {"term": {"tags.id": 22}}
]