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 ]]
]
Другие вопросы по тегам