ElasticSearch筛选多个字段必填

问题描述 投票:0回答:1

我有这个疑问(通过PHP客户端)的ElasticSearch 6.2:

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

它的工作原理,如果我用两种row.namerow.origin只是一个搜索,但兼具它就像一个OR并返回所有结果。我怎样才能进行过滤,只返回是row.namerow.origin精确匹配的文件

elasticsearch elasticsearch-6 elasticsearch-php
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 ]]
]
© www.soinside.com 2019 - 2024. All rights reserved.