查询格式不正确,应为[END_OBJECT],但发现为[FIELD_NAME]

时间:2019-10-31 13:08:13

标签: elasticsearch

原始查询如下所示

{
    "query": {
        "bool": {
            "must": [
                {
                    "has_parent": {
                        "parent_type": "doc",
                        "query": {
                            "bool": {
                                "must": [
                                    {
                                        "terms": {
                                            "id": [
                                                713
                                            ]
                                        }
                                    },
                                    {
                                        "range": {
                                            "created": {
                                                "lte": "now/d"
                                            }
                                        }
                                    },
                                    {
                                        "range": {
                                            "expires": {
                                                "gte": "now/d"
                                            }
                                        }
                                    }
                                ]
                            }
                        }
                    }
                },
                {
                    "term": {
                        "doc_type": "item"
                    }
                },
                {
                    "bool": {
                        "should": [
                            {
                                "term": {
                                    "have_prices": true
                                }
                            },
                            {
                                "term": {
                                    "is_folder": true
                                }
                            }
                        ]
                    }
                }
            ],
            "must_not": {
                "exists": {
                    "field": "folder"
                }
            }
        }
    },
    "sort": [
        {
            "is_folder": {
                "order": "desc"
            }
        },
        {
            "title_low.order": {
                "order": "asc"
            }
        }
    ],
   "size": 1000 
}

我得到了一些结果

"hits": {
        "total": 19,
        "max_score": null,
        "hits": [
            {
                "_index": "prices",
                "_type": "doc",
                "_id": "item-6800004",
                "_score": null,
                "_routing": "1",
                "_source": {
                    "id": 6800004,
                    "id_pricedoc": 713,
                    "title": "\"водка №1\" 1",
                    "title_low": "\"водка №1\" 1",
                    "supplier": {
                        "id": 7831,
                        "type": null
                    },
                    "supplier_nom": {
                        "id": 1375697,
                        "market_nom": {
                            "id": null
                        },
                        "codes": null,
                        "sup_code": "7a6713a5-73c1-3acb-9b62-9e38b2314dce",
                        "manufacturer": {
                            "id": null,
                            "title": null
                        }
                    },
                    "is_folder": false,
                    "folder": null,
                    "path": null,
                    "pricedoc_created": "2016-03-21",
                    "prices": [
                        {
                            "currency": "RUR",
                            "id_offer": 15735967,
                            "id_prcknd": 167,
                            "value": "391.50"
                        }
                    ],
                    "have_prices": true,
                    "market": {
                        "title": null,
                        "uuid": null,
                        "folder": null,
                        "path": null
                    },
                    "_join_field_name": "doc_type",
                    "doc_type": {
                        "name": "item",
                        "parent": "doc-713"
                    }
                },
                "sort": [
                    0,
                    "\"водка №1\" 1"
                ]
            }

现在,我也想得到“ id_prcknd”为167的结果

修改后的查询如下

{
    "query": {
        "bool": {
            "must": [
                {
                    "has_parent": {
                        "parent_type": "doc",
                        "query": {
                            "bool": {
                                "must": [
                                    {
                                        "terms": {
                                            "id": [
                                                713
                                            ]
                                        }
                                    },
                                    {
                                        "range": {
                                            "created": {
                                                "lte": "now/d"
                                            }
                                        }
                                    },
                                    {
                                        "range": {
                                            "expires": {
                                                "gte": "now/d"
                                            }
                                        }
                                    }
                                ]
                            }
                        }
                    }
                },
                {
                    "term": {
                        "doc_type": "item"
                    }
                },
                {
                    "bool": {
                        "should": [
                            {
                                "term": {
                                    "have_prices": true
                                }
                            },
                            {
                                "term": {
                                    "is_folder": true
                                }
                            }
                        ]
                    }
                }
            ],
            "must_not": {
                "exists": {
                    "field": "folder"
                }
            }
        },
        "nested": {
                "path": "prices",
                "query": {
                    "bool": {
                        "must": [
                            {
                                "match": {
                                    "prices.id_prcknd": 167
                                }
                            }
                        ]
                    }
                }
    },
    "sort": [
        {
            "is_folder": {
                "order": "desc"
            }
        },
        {
            "title_low.order": {
                "order": "asc"
            }
        }
    ],
   "size": 1000 
}}

但是我收到了一个错误的Elasticsearch格式错误的查询,应该是[END_OBJECT],但是发现了[FIELD_NAME] 我哪里错了? 我想匹配“ id_prcknd”为167的对象 stackoverflow表示,我主要发布代码,但这是由于弹性搜索中的大型查询。

2 个答案:

答案 0 :(得分:1)

Elasticsearch试图说的是,除了字典中的bool"query"下的值)之外,它没有希望看到其他键。

在示例代码中,您将具有以下内容:

{
    "query": {
        "bool": {
            "must": [
                {...},
                {...},
                {...}
            ],
            "must_not": {...},
        "nested": {...}, // this should go under "must"
        "sort": [...],   // this should go on the same level as "query"
        "size": 1000     // this should go on the same level as "query"
    }
}

"bool"是指bool查询,应该是字典中的唯一键。

您应该做的是将"nested"移到其自己的字典中,并移至must数组的第四个元素(如果我理解您要正确实现的逻辑的话)。请注意,"sort""size"也应移动-这次与"query"处于同一级别。

完整查询如下:

{
    "query": {
        "bool": {
            "must": [
                {
                    "has_parent": {
                        "parent_type": "doc",
                        "query": {
                            "bool": {
                                "must": [
                                    {
                                        "terms": {
                                            "id": [
                                                713
                                            ]
                                        }
                                    },
                                    {
                                        "range": {
                                            "created": {
                                                "lte": "now/d"
                                            }
                                        }
                                    },
                                    {
                                        "range": {
                                            "expires": {
                                                "gte": "now/d"
                                            }
                                        }
                                    }
                                ]
                            }
                        }
                    }
                },
                {
                    "term": {
                        "doc_type": "item"
                    }
                },
                {
                    "bool": {
                        "should": [
                            {
                                "term": {
                                    "have_prices": true
                                }
                            },
                            {
                                "term": {
                                    "is_folder": true
                                }
                            }
                        ]
                    }
                },
                {
                    "nested": {
                        "path": "prices",
                        "query": {
                            "bool": {
                                "must": [
                                    {
                                        "match": {
                                            "prices.id_prcknd": 167
                                        }
                                    }
                                ]
                            }
                        }
                    }
                }
            ],
            "must_not": {
                "exists": {
                    "field": "folder"
                }
            }
        }
    },
    "sort": [
        {
            "is_folder": {
                "order": "desc"
            }
        },
        {
            "title_low.order": {
                "order": "asc"
            }
        }
    ],
    "size": 1000
}

希望有帮助!

答案 1 :(得分:0)

您的json不正确:错误:预计结尾处结束} [代码22,结构183]

例如,使用json验证程序(https://jsonformatter.curiousconcept.com/)。