【问题标题】:Elasticsearch query error - [or] query malformed, no start_object after query nameElasticsearch 查询错误 - [或] 查询格式错误,查询名称后没有 start_object
【发布时间】:2019-03-02 01:26:04
【问题描述】:

有人可以解释一下这个查询有什么问题吗?我需要将这个生成的查询从 Elasticsearch 2 转换为 Elasticsearch 6。在 ES2 中,这个运行良好,但在 ES6 中它会抛出一个错误:[or] query malformed,no start_object after query name。我迷失在其中。 OR 是必要的,因为可能有比这更多的条件。

{
    "query": {
        "bool": {
            "filter": {
                "or": [
                    {
                        "nested": {
                            "path": "zalozcovia",
                            "query": {
                                "bool": {
                                    "filter": [
                                        {
                                            "match": {
                                                "zalozcovia.meno": "\u013dubo\u0161"
                                            }
                                        },
                                        {
                                            "match": {
                                                "zalozcovia.priezvisko": "Majgot"
                                            }
                                        },
                                        {
                                            "match": {
                                                "zalozcovia.mesto": "Trnava"
                                            }
                                        }
                                    ]
                                }
                            }
                        }
                    }
                ]
            }
        }
    },
    "size": 20,
    "sort": [
        {
            "rok": "desc"
        },
        {
            "cislo": "desc"
        }
    ]
}

谢谢。

【问题讨论】:

    标签: elasticsearch filter


    【解决方案1】:

    在 ES6 中没有“或”查询 (https://www.elastic.co/guide/en/elasticsearch/reference/6.4/query-dsl-or-query.html)。您应该使用 bool 查询并在那里使用“应该”部分 (https://www.elastic.co/guide/en/elasticsearch/reference/6.4/query-dsl-bool-query.html)。

    {
        "query": {
            "bool": {
                "filter": [{
                    "bool": {
                        "should": [{
                            "nested": {
                                "path": "zalozcovia",
                                "query": {
                                    "bool": {
                                        "filter": [{
                                                "match": {
                                                    "zalozcovia.meno": "\u013dubo\u0161"
                                                }
                                            },
                                            {
                                                "match": {
                                                    "zalozcovia.priezvisko": "Majgot"
                                                }
                                            },
                                            {
                                                "match": {
                                                    "zalozcovia.mesto": "Trnava"
                                                }
                                            }
                                        ]
                                    }
                                }
                            }
                        }]
                    }
                }]
            }
        },
        "size": 20,
        "sort": [{
                "rok": "desc"
            },
            {
                "cislo": "desc"
            }
        ]
    }
    

    【讨论】:

    • 是的,我知道,但应该只在 [或] 是 [应该] 的情况下向我抛出同样的错误
    • 不要在should 部分中添加or
    • 我不知道。我将 OR 更改为应该。
    • 你能显示你更正的查询吗?至少错误以某种方式表明,您的语法仍然不适用。我认为您应该摆脱第一个过滤器并切换或切换到应该。
    • 您删除了 FILTER 级别。我错过了。没有过滤器它可以工作。但我不确定是否可以将其从查询中删除。
    【解决方案2】:

    尝试用 should 改变“filter-or”

    {
        "query": {
            "bool": {
                  "should" : [
                        {
                            "nested": {
                                "path": "zalozcovia",
                                "query": {
                                    "bool": {
                                        "filter": [
                                            {
                                                "match": {
                                                    "zalozcovia.meno": "\u013dubo\u0161"
                                                }
                                            },
                                            {
                                                "match": {
                                                    "zalozcovia.priezvisko": "Majgot"
                                                }
                                            },
                                            {
                                                "match": {
                                                    "zalozcovia.mesto": "Trnava"
                                                }
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    ]
                }
        },
        "size": 20,
        "sort": [
            {
                "rok": "desc"
            },
            {
                "cislo": "desc"
            }
        ]
    }
    

    【讨论】:

    • 是的,它可以工作,但我不确定是否可以从查询中删除过滤器级别。过滤器应该效率不高,因为它不计算分数。我说的对吗?
    • 我不确定先生,但是在您上面的查询中,似乎不需要使用 or 进行过滤 :) 您可以检查此答案的必须和过滤差异:stackoverflow.com/a/43349478/2057653
    • 我知道,但条件可能不止一个。
    • 您可以将每个条件添加到应该数组吗?我不明白这是怎么回事?
    • 好的,我知道了。 FILTER 内应该还有一个 BOOL 级别。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 2021-05-06
    • 2017-07-10
    • 1970-01-01
    • 2018-10-13
    相关资源
    最近更新 更多