在Elasticsearch中选择在其嵌套属性中包含任何提供的对象的文档

时间:2017-11-15 13:20:36

标签: elasticsearch elasticsearch-5

在我的索引中,我有一个映射,其中包含“嵌套”类型的locations属性。此属性包含一系列位置。每个位置都是具有以下结构的对象:

{
    "id": string,
    "type": string
}

在我的网站上,我想选择多个位置,找到所选文件中 ANY 的所有文档。我能够在一个位置搜索,但我必须以某种方式修改我的查询以搜索许多位置。

我设置了以下索引:

"mappings": {
    "users": {
        "properties": {
            "locations": {
                "type": "nested",
                "properties": {
                    "id": {
                        "type": "text",
                        "fields": {
                            "keyword": {
                                "type": "keyword",
                                "ignore_above": 256
                            }
                        }
                    },
                    "type": {
                        "type": "text",
                        "fields": {
                            "keyword": {
                                "type": "keyword",
                                "ignore_above": 256
                            }
                        }
                    }
                }
            },
            "id": {
                "type": "long"
            }
        }
    }
}

示例文件:

{
    "locations": [
        {
            "id": "UA",
            "type": "country"
        },
        {
            "id": "RU",
            "type": "country"
        },
        {
            "id": "OC",
            "type": "continent"
        }
    ]
}

我按位置搜索用户的查询:

{
    "query": {
        "bool": {
            "must": [
                {
                    "nested": {
                        "path": "locations",
                        "query": {
                            "bool": {
                                "must": [
                                    {
                                        "match": { "locations.id": "RU" }
                                    },
                                    {
                                        "match": { "locations.type": "country" }
                                    }
                                ]
                            }
                        }
                    }
                }   
            ]
        }
    }
}

修改: 我还想检索locations.type等于continent的文档。在SQL中它看起来像

WHERE (id IN ('UA', 'RU') AND type = 'country') 
OR (id IN ('EU', 'OC', 'NA') AND type = 'continent')

1 个答案:

答案 0 :(得分:1)

使用Terms进行多值搜索,使用var arr = ['cats', 'giants', 'daughters', 'ice']; var min = Math.min(...arr.map(({ length }) => length)); console.log(min); 使用OR条件(参见here):

should