ElasticSearch — Elastic\Elasticsearch\Exception\ClientResponseException

Я реализовал ElasticSearch в нашем организационном приложении, и до сих пор все шло хорошо, но когда я попытался добавить условия в запрос, он начал выдавать 400-й код почти на все, что я пытаюсь выполнить, следуя их документации.

Моя борьба заключается в том, чтобы запрашивать только продукты со статусом «активный».

Вот фрагмент кода.

       $products = $this->elasticsearch->search([
            'index' => $product->getSearchIndex(),
            'type' => $product->getSearchType(),
            'body' => [
                '_source' => ['category_id', 'title', 'status'],
                'size' => 30,
                'query' => [
                    'bool' => [
                        'must' => [
                            'multi_match' => [ // ^1 means that title field has a higher priority in search tree
                                'fields' => ['title^1'],
                                'type' => 'phrase_prefix',
                                'query' => $query,
                            ],
                            'bool' => [
                                'must' => [
                                    [
                                        'term' => ['status' => ProductStatus::ACTIVE]
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ]);

Вот полный текст исключения, который я получаю от elastic, используя приведенный выше фрагмент кода.

400 Bad Request: {"error":{"root_cause":[{"type":"parsing_exception","reason":"[multi_match] malformed query, expected [END_OBJECT] but found [FIELD_NAME]","line":1,"col":170}],"type":"x_content_parse_exception","reason":"[1:170] [bool] failed to parse field [must]","caused_by":{"type":"parsing_exception","reason":"[multi_match] malformed query, expected [END_OBJECT] but found [FIELD_NAME]","line":1,"col":170}},"status":400}

Я пробовал использовать фильтры и т. д., но ни одна из инструкций в документации не привела меня к успеху.

Что мне не хватает?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш multi_match просто должен находиться в отдельном элементе массива.

            'query' => [
                'bool' => [
                    'must' => [
                      [
                        'multi_match' => [ // ^1 means that title field has a higher priority in search tree
                            'fields' => ['title^1'],
                            'type' => 'phrase_prefix',
                            'query' => $query,
                        ]
                      ],
                      [
                         'term' => ['status' => ProductStatus::ACTIVE]
                      ],
                    ],
                ],
            ],

Также было бы более эффективно сделать это таким образом, переместив ограничение с status на bool/filter:

            'query' => [
                'bool' => [
                    'must' => [
                      [
                        'multi_match' => [ // ^1 means that title field has a higher priority in search tree
                            'fields' => ['title^1'],
                            'type' => 'phrase_prefix',
                            'query' => $query,
                        ]
                      ]
                    ],
                    'filter' => [
                      [
                         'term' => ['status' => ProductStatus::ACTIVE]
                      ],
                    ],
                ],
            ],

Спасибо, Вэл, сегодня попробую чуть позже и отвечу свой отзыв.

e-goat 16.05.2024 11:32

На самом деле, я только что попробовал, и все получилось!

e-goat 16.05.2024 11:37

Другие вопросы по теме