Я реализовал 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}
Я пробовал использовать фильтры и т. д., но ни одна из инструкций в документации не привела меня к успеху.
Что мне не хватает?






Ваш 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]
],
],
],
],
На самом деле, я только что попробовал, и все получилось!
Спасибо, Вэл, сегодня попробую чуть позже и отвечу свой отзыв.