Elasticsearch 过滤器 - AND/OR 行为

Elasticsearch Filter - AND/OR behaviour

我有这个查询,我在其中搜索匹配 type: location 的所有文档,然后使用 postalCodecountryCode 上的完全匹配但前缀对结果应用过滤器address.

过滤器工作正常并且表现为 AND 条件,即所有 3 个匹配项。如何在过滤器中实现 OR 条件?使用 OR 条件 - 即使一个过滤器匹配,它也应该 return 结果。

Elasticsearch 版本 - 7.9

GET index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "type": "location"
          }
        }
      ],
      "filter": [
        {
          "term": {
            "postalCode": "12345"
          }
        },
        {
          "prefix": {
            "address": "555"
          }
        },
        {
          "term": {
            "countryCode": "US"
          }
        }
      ]
    }
  }
}

您可以在 filter 子句中使用 bool should 子句的组合。

添加具有索引数据、搜索查询和搜索结果的工作示例

索引数据:

{
  "postalCode": "12345",
  "address": "555",
  "countryCode": "US",
  "type":"location"
}
{
  "postalCode": "9",
  "address": "555",
  "countryCode": "US",
  "type":"location"
}
{
  "postalCode": "9",
  "address": "4",
  "countryCode": "US",
  "type":"location"
}
{
  "postalCode": "9",
  "address": "4",
  "countryCode": "AK",
  "type":"location"
}

搜索查询:

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "type": "location"
          }
        }
      ],
      "filter": [
        {
          "bool": {
            "should": [
              {
                "term": {
                  "postalCode": "12345"
                }
              },
              {
                "prefix": {
                  "address": "555"
                }
              },
              {
                "term": {
                  "countryCode.keyword": "US"
                }
              }
            ],
            "minimum_should_match":1
          }
        }
      ]
    }
  }
}

搜索结果:

"hits": [
      {
        "_index": "65192559",
        "_type": "_doc",
        "_id": "2",
        "_score": 0.10536051,
        "_source": {
          "postalCode": "9",
          "address": "555",
          "countryCode": "US",
          "type": "location"
        }
      },
      {
        "_index": "65192559",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.10536051,
        "_source": {
          "postalCode": "12345",
          "address": "555",
          "countryCode": "US",
          "type": "location"
        }
      },
      {
        "_index": "65192559",
        "_type": "_doc",
        "_id": "3",
        "_score": 0.10536051,
        "_source": {
          "postalCode": "9",
          "address": "4",
          "countryCode": "US",
          "type": "location"
        }
      }
    ]