Я смотрел Эластичные поиски, что нельзя, а что нельзя делать от Итамар Син Хершко
https://www.youtube.com/watch?v=c9O5_a50aOQ
Я вижу несколько условийв нескольких полях на следующем изображении:
https://imgur.com/a/17zAZ4w
Я попытался сделать это в своем приложении Laravel 5.7 (с плагиномasticsearch /asticsearch), как показано вследующий код:
$elasticQuery = [
"bool" => [
'must' => [
'multi_match' => [
'query' => $text,
'fields' => ['name^4', 'description']
],
],
"should" => [
'term' => [
"category_id" => 1,
]
]
]
];
но я получил ошибку:
{"error":{"root_cause":[{"type":"parsing_exception","reason":"[bool] malformed query, expected [END_OBJECT] but found [FIELD_NAME]","line":1,"col":130}],"type":"parsing_exception","reason":"[bool] malformed query, expected [END_OBJECT] but found [FIELD_NAME]","line":1,"col":130},"status":400}
Но когда я использую простое условие:
$elasticQuery = [
'multi_match' => [
'query' => $text,
'fields' => ['name^4', 'description'],
],
];
я получил правильный результат:
[hits] => Array
(
[total] => 1
[max_score] => 7.4126062
[hits] => Array
(
[0] => Array
(
[_index] => select_vote
[_type] => vote
[_id] => 16
[_score] => 7.4126062
[_source] => Array
(
[id] => 16
[slug] => in-the-film-babe-what-type-of-animal-was-babe
[name] => In the film Babe, what type of animal was Babe?
[description] => Babe is a 1995 A...
[created_at] => 2018-11-10 09:14:15
[category_id] => 2
[category] => Array
(
[name] => Movie&Cartoons
[slug] => movie-cartoons
[created_at] => 2018-11-10 09:14:12
)
)
)
)
)
это правильный формат для нескольких запросов?
МОДИФИЦИРОВАННЫЙ БЛОК # 2: Выполнение поиска показалось мне работоспособным:
$elasticQuery = [
"bool" => [
'should' => [
[
"multi_match" => [
"query" => $text,
"type" => "cross_fields",
"fields" => [
"name^4",
"description"
]
]
],
[
'match' => [
'category_id' => [
'query' => 1,
]
]
],
[
'match' => [
'category_id' => [
'query' => 3,
]
]
],
]
]
];
, когда мне нужно выполнить поиск по текстовым полям и массиву категории (1 и 3) в примеревыше он работает, но выглядит так, как будто он работает как условие «ИЛИ», но мне нужно сделать ограничение типа «И», используя терминологию SQL ...
Какой способ является правильным, чтобы сделать ограничение как«И»?
Спасибо!