ElasticSearch Filter Требуется несколько полей - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть этот запрос (через 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 Ответ

0 голосов
/ 04 февраля 2019

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

Вместо:

[
    "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 ]]
]
...