【问题标题】:Elasticsearch: Multi-level nested query not workingElasticsearch:多级嵌套查询不起作用
【发布时间】:2015-09-09 09:30:45
【问题描述】:

我的映射如下:

{
    "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": {}
        }
    }
}

这样查询就起作用了。我觉得这与多级嵌套有关。多级嵌套不起作用。

【问题讨论】:

    标签: java json search elasticsearch


    【解决方案1】:

    嵌套路径属性需要是“person.car”。

    如果您希望 person 是嵌套字段类型,则在(第 2 级)person 属性行上方添加“type”:“nested”,这是嵌套查询搜索所必需的。默认字段类型为对象字段。

    您使用的命名令人困惑,请尝试重命名您的映射,不要使用 person 两次。

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

    【讨论】:

    • 我尝试了该查询,但收到错误QueryParsingException[[my_index] [nested] nested object under path [person] is not of nested type]
    • 如答案所示:如果您希望 person 成为嵌套字段类型,请在(第 2 级)person 属性行上方添加“type”:“nested”。编辑后的答案更清楚。
    • 好的,我用嵌套的第二级人员重新创建了我的索引。该查询路径应为person.person,如下所示:pastebin.com/Nfj0gcTj。您的查询导致错误,因为路径“person”(第一级)未嵌套。我在 pastebin 中输入的查询有效,但没有返回任何结果。
    • 这是因为您的命名与 ES 理解查询不符。如果您重命名您的“人”字段之一,那么它将起作用。如果您重命名第一级,则保持查询相同,如果您重命名第二级人员,则需要将“路径”更改为您将其重命名为的任何内容。
    • 重命名了,还是同样的问题,结果为空。由于该名称,我发布的示例很糟糕,但是我多次使用不同的名称尝试了同样的事情,这是相同的错误。这可能是 ES 的问题吗?
    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多