ElasticSearch 筛选需要的多个字段
ElasticSearch Filter Multiple Fields Required
我有这个 ElasticSearch 6.2 查询(通过 PHP 客户端):
[
"query"=> [
"bool" => [
"filter" => [
"term" => [ "row.name" => $name ],
"term" => [ "row.origin" => $origin ]
]
]
],
"size" => "10"
]
如果我只对 row.name
或 row.origin
使用一次搜索,它会起作用,但如果同时使用两者,它的工作方式就像 OR 和 return 的所有结果。我如何才能过滤到 return 与 row.name
和 row.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 ]]
]
我有这个 ElasticSearch 6.2 查询(通过 PHP 客户端):
[
"query"=> [
"bool" => [
"filter" => [
"term" => [ "row.name" => $name ],
"term" => [ "row.origin" => $origin ]
]
]
],
"size" => "10"
]
如果我只对 row.name
或 row.origin
使用一次搜索,它会起作用,但如果同时使用两者,它的工作方式就像 OR 和 return 的所有结果。我如何才能过滤到 return 与 row.name
和 row.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 ]]
]