Elasticsearch:多级嵌套查询无法正常工作

时间:2015-06-23 14:12:42

标签: java json search elasticsearch

我的映射如下:

{
    "mappings": {
        "person": {
            "properties": {
                "lastUpdated": {
                    "type": "long"
                },
                "isDeleted": {
                    "type": "boolean"
                },
                "person": {
                    "properties": {
                        "car": {
                            "type": "nested",
                            "properties": {
                                "model": {
                                    "type": "string"
                                },
                                "make": {
                                    "type": "string"
                                }
                            }
                        },
                        "last_name": {
                            "type": "string"
                        },
                        "first_name": {
                            "type": "string"
                        }
                    }
                }
            }
        }
    }
}

我有两份文件:

{
    "person": {
        "first_name": "Bob",
        "last_name": "Doe",
        "car": [
            {
                "make": "Saturn",
                "model": "Imprezza"
            },
            {
                "make": "Honda",
                "model": "Accord"
            }
        ]
    },
    "isDeleted": false,
    "lastUpdated": 1433257051959
}

{
    "person": {
        "first_name": "Zach",
        "last_name": "Foobar",
        "car": [
            {
                "make": "Saturn",
                "model": "SL"
            },
            {
                "make": "Subaru",
                "model": "Imprezza"
            }
        ]
    },
    "isDeleted": false,
    "lastUpdated": 1433257051959
}

我想查询car.make字段,因此,我写了以下查询:

{
    "query": {
        "nested": {
            "path": "person.person.car",
            "query": {
                "match": {
                    "car.make": "Saturn"
                }
            },
            "inner_hits": {}
        }
    }
}

然而,我没有得到任何回报结果。当我删除person级别对象并尝试搜索时,它会起作用。知道如何进行多级嵌套查询吗?

编辑:另一方面,当我像这样构建我的数据并进行查询时,它就会起作用。

{
    "mappings": {
        "person": {
            "properties": {
                "car": {
                    "type": "nested",
                    "properties": {
                        "model": {
                            "type": "string"
                        },
                        "make": {
                            "type": "string"
                        }
                    }
                },
                "last_name": {
                    "type": "string"
                },
                "first_name": {
                    "type": "string"
                }
            }
        }
    }
}

{
    "first_name": "Zach",
    "last_name": "Foobar",
    "car": [
        {
            "make": "Saturn",
            "model": "SL"
        },
        {
            "make": "Subaru",
            "model": "Imprezza"
        }
    ]
}

{
    "first_name": "Bob",
    "last_name": "Doe",
    "car": [
        {
            "make": "Saturn",
            "model": "Imprezza"
        },
        {
            "make": "Honda",
            "model": "Accord"
        }
    ]
}

{
    "query": {
        "nested": {
            "path": "person.car",
            "query": {
                "match": {
                    "car.make": "Honda"
                }
            },
            "inner_hits": {}
        }
    }
}

这种查询有效。我觉得这与多级嵌套有关。多级嵌套无法正常工作。

1 个答案:

答案 0 :(得分:0)

嵌套路径属性必须是“person.car”。

如果您希望人员是嵌套字段类型(嵌套查询搜索所需),请在“第二级”人员属性行上方添加“类型”:“嵌套”。默认字段类型是对象字段。

您正在使用的命名令人困惑,请尝试重命名您的地图,而不是两次使用此人。

{
    "query": {
        "nested": {
            "path": "person.car",
            "query": {
                "match": {
                    "make": "Saturn"
                }
            },
            "inner_hits": {}
        }
    }
}