0

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

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

row.name如果我只对or使用一次搜索,row.origin它就可以工作,但两者都像 OR 一样工作并返回所有结果。如何过滤以仅返回与row.nameAND完全匹配的文档row.origin

4

1 回答 1

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 ]]
]
于 2019-02-04T10:47:05.003 回答