неправильно сформированный запрос, ожидается [END_OBJECT], но найден [FIELD_NAME] - PullRequest
1 голос
/ 31 октября 2019

Исходный запрос выглядит следующим образом

{
    "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 В стеке говорится, что я публикую в основном код, но это из-за больших запросов в упругом поиске.

Ответы [ 2 ]

1 голос
/ 01 ноября 2019

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
}

Надеюсь, это поможет!

0 голосов
/ 31 октября 2019

Ваш json неверен: Ошибка: ожидается закрытие} в конце [Код 22, структура 183]

Используйте валидатор json (например, https://jsonformatter.curiousconcept.com/).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...