【问题标题】:ElasticSearch Filter Multiple Fields RequiredElasticSearch 过滤多个必填字段
【发布时间】:2019-06-28 00:59:03
【问题描述】:

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

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

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

【问题讨论】:

    标签: elasticsearch elasticsearch-6 elasticsearch-php


    【解决方案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 ]]
    ]
    

    【讨论】:

      猜你喜欢
      • 2015-07-12
      • 2018-07-14
      • 1970-01-01
      • 2022-06-30
      • 2020-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-25
      相关资源
      最近更新 更多