ElasticSearch 筛选需要的多个字段

ElasticSearch Filter Multiple Fields Required

我有这个 ElasticSearch 6.2 查询(通过 PHP 客户端):

[
    "query"=> [
        "bool" => [
            "filter" => [
                "term" => [ "row.name" => $name ],
                "term" => [ "row.origin" => $origin ]
            ]
        ]
    ],
    "size" => "10"
]

如果我只对 row.namerow.origin 使用一次搜索,它会起作用,但如果同时使用两者,它的工作方式就像 OR 和 return 的所有结果。我如何才能过滤到 return 与 row.namerow.origin

完全匹配的文档

你的方法是正确的,但我猜你漏掉了括号。

而不是:

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