首页 > 解决方案 > ElasticSearch:按术语查找项目,如果不存在则忽略它

问题描述

我需要按几个字段过滤项目。每个字段必须等于 value 或不存在。这个过滤器可以用下面的代码来实现,但它不起作用:

{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "$parentId": 1111
          }
        },
        {
          "terms": {
            "color.keyword": [
              "red",
              null
            ]
          }
        },
        {
          "terms": {
            "size.keyword": [
              "6",
              null
            ]
          }
        }
      ]
    }
  }
}

是否可以实现类似的工作过滤器?

标签: elasticsearch

解决方案


要检查字段是否存在任何值,您可以使用存在查询。由于要求字段具有特定值或字段没有值(相当于字段一定不存在),因此使用bool 查询的查询如下:

{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "$parentId": 1111
          }
        },
        {
          "bool": {
            "should": [
              {
                "term": {
                  "color.keyword": 111
                }
              },
              {
                "bool": {
                  "must_not": {
                    "exist": {
                      "field": "color.keyword"
                    }
                  }
                }
              }
            ]
          }
        },
        {
          "bool": {
            "should": [
              {
                "term": {
                  "size.keyword": 111
                }
              },
              {
                "bool": {
                  "must_not": {
                    "exist": {
                      "field": "size.keyword"
                    }
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}

这个想法是should需要有两个期望的条件——完全满足术语或字段不能存在。should查询确保至少有一个条件必须匹配查询数组。


推荐阅读