You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Elasticsearch中编写不存在指定属性的查询?

解决方案:Elasticsearch查询不存在特定字段值的文档

首先提个小细节:你的示例数据里有几处identifer的拼写错误(少了一个字母i,正确应该是identifier),这个要注意修正,不然查询会匹配不到对应字段哦!

接下来分两种常见场景,以及不同字段类型下的查询写法:

场景1:查找没有某个特定identifier的文档

比如你想找出像_id=3这样,完全没有identifier: "product"条目的文档。

如果fields是默认的object类型

直接用bool查询结合must_not即可:

{
  "query": {
    "bool": {
      "must_not": [
        {
          "term": {
            "fields.identifier": "product"
          }
        }
      ]
    }
  }
}

这个查询会返回所有不包含identifier为"product"的fields条目的文档,也就是你示例里的_id=3。

如果fields是nested类型

如果你的mapping里把fields定义成了nested类型(这种类型会把数组里的每个对象当作独立的子文档存储,避免扁平化导致的查询不准确),那必须用nested查询来包裹条件:

{
  "query": {
    "bool": {
      "must_not": [
        {
          "nested": {
            "path": "fields",
            "query": {
              "term": {
                "fields.identifier": "product"
              }
            }
          }
        }
      ]
    }
  }
}

场景2:查找存在某个identifier,但对应的value不存在/为空的文档

比如你想找有identifier: "product"条目,但该条目的value字段为空或不存在的文档。

如果fields是默认的object类型

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "fields.identifier": "product"
          }
        }
      ],
      "must_not": [
        {
          "exists": {
            "field": "fields.value"
          }
        }
      ]
    }
  }
}

如果fields是nested类型

这里需要精准匹配到同一个子对象里的identifier和value,所以要在nested查询里嵌套bool条件:

{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "fields",
            "query": {
              "term": {
                "fields.identifier": "product"
              }
            }
          }
        }
      ],
      "must_not": [
        {
          "nested": {
            "path": "fields",
            "query": {
              "bool": {
                "must": [
                  {
                    "term": {
                      "fields.identifier": "product"
                    }
                  },
                  {
                    "exists": {
                      "field": "fields.value"
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

补充说明

  • 默认的object类型会把数组中所有对象的字段扁平化存储,比如fields.identifier会变成所有条目的identifier集合,这种情况下简单的term查询就能生效,但如果你的文档里有多个同identifier的条目,可能会有歧义;
  • nested类型则会为数组里的每个对象创建独立的索引,查询时必须用nested查询来定位到具体的子对象,结果更精准,适合复杂的嵌套数组场景。

内容的提问来源于stack exchange,提问作者hash12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:10:26