如何使用必须过滤来自不同层次结构

时间:2015-04-27 06:17:28

标签: elasticsearch

我的索引中有以下对象:

{
    "user" : {
        "info" : {
            "fname" : "John",
            "lname" : "Stark"
        },
        "settings" : {
            "hide_menu" : true,
            "time_offset" : 3
        }
    },
    "views" : [
    ]
}

这是映射:

{
    "dynamic" : "false",
    "properties" : {
        "user" : {
            "type" : "nested",
            "dynamic" : "false",
            "properties" : {
                "info" : {
                    "type" : "nested",
                    "dynamic" : "false",
                    "properties" : {
                        "fname" : {
                            "type" : "string",
                            "index" : "not_analyzed"
                        },
                        "lname" : {
                            "type" : "string",
                            "index" : "not_analyzed"
                        }
                    }
                },
                "settings" : {
                    "type" : "nested",
                    "dynamic" : "false",
                    "properties" : {
                        "hide_menu" : {
                            "type" : "boolean"
                        },
                        "time_offset" : {
                            "type" : "long"
                        }
                    }
                }
            }
        }
    }
}

我想创建一个过滤器来查找名字为John并且time_offset = 3的所有用户 所以我需要构建一个必须过滤器,但问题是这两个字段嵌套在不同的层次结构上:user.info和user.settings

如何使用它们进行必须过滤(AND)?

1 个答案:

答案 0 :(得分:0)

您可以使用点表示法简单地引用字段。

"filter":{
     "bool": {
            "must": [
                {
                    "terms": {
                        "user.info.fname": [
                            "John"
                        ]
                    }
                },
                {
                    "terms": {
                        "user.settings.time_offset": [
                            3
                        ]
                    }
                }
            ]
        }
    }
}

修改:根据提供的映射更新了查询

{
    "filter": {
        "nested": {
            "path": "user",
            "filter": {
                "bool": {
                    "must": [
                        {
                            "nested": {
                                "path": "user.info",
                                "filter": {
                                    "terms": {
                                        "user.info.fname": [
                                            "John"
                                        ]
                                    }
                                }
                            }
                        },
                        {
                            "nested": {
                                "path": "user.settings",
                                "filter": {
                                    "terms": {
                                        "user.settings.time_offset": [
                                            3
                                        ]
                                    }
                                }
                            }
                        }
                    ]
                }
            }
        }
    }
}