ElasticSearch Filter Требуется несколько полей
У меня есть этот запрос (через PHP-клиент) для ElasticSearch 6.2:
[
"query"=> [
"bool" => [
"filter" => [
"term" => [ "row.name" => $name ],
"term" => [ "row.origin" => $origin ]
]
]
],
"size" => "10"
]
Это работает, если я использую только один поиск либо row.name
или же row.origin
, но с обоими это работает как ИЛИ и возвращает все результаты. Как я могу фильтровать только те документы, которые точно соответствуют row.name
А ТАКЖЕ row.origin
1 ответ
Решение
Вы выбрали правильный путь, но я предполагаю, что вы пропустили скобки.
Вместо:
[
"query"=> [
"bool" => [
"filter" => [
"term" => [ "row.name" => $name ],
"term" => [ "row.origin" => $origin ]
]
]
],
"size" => "10"
]
У тебя должно быть:
[
"query"=> [
"bool" => [
"filter" => [
["term" => [ "row.name" => $name ]],
["term" => [ "row.origin" => $origin ]]
]
]
],
"size" => "10"
]
В вашем случае вы создали карту с двумя одинаковыми (term
) ключи:
[
"term" => [ "row.name" => $name ],
"term" => [ "row.origin" => $origin ]
]
Итак, второе term
преодолел первый и на самом деле вы отправили:
[
"term" => [ "row.origin" => $origin ]
]
Чтобы отправить несколько term
Фильтры вам нужны, поэтому они будут рассматриваться как список:
[
["term" => [ "row.name" => $name ]],
["term" => [ "row.origin" => $origin ]]
]