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

Kibana中如何查询返回未包含数组全部指定值的文档

Elasticsearch筛选数组字段未同时包含指定值的实现

场景说明

现有文档包含数组类型字段user.userDatas.user_roles,字段值示例如下:

user.userDatas.user_roles[1,2,3]
user.userDatas.user_roles[1,2,3,4,5]
user.userDatas.user_roles[1,3,4,5]

需求为筛选出未同时包含[1,2,3]三个值的文档:只要该数组字段缺失1、2、3中的任意一个值,就返回对应文档。例如上述示例中,user.userDatas.user_roles值为[1,3,4,5]的文档缺失值2,属于预期返回结果。
原有查询语句仅能返回同时匹配1、2、3三个值的记录,无法得到缺失任意指定值的结果,原有语句如下:

{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "user.userDatas.user_roles": 1
          }
        },
        {
          "term": {
            "user.userDatas.user_roles": 2
          }
        },
        {
          "term": {
            "user.userDatas.user_roles": 3
          }
        }
      ]
    }
  }
} 

正确实现

原有语句的逻辑是匹配「同时包含1、2、3三个值」的文档,要拿到相反结果,只需要将这组匹配条件放到bool查询的must_not子句中即可。must_not会排除所有满足内部条件的文档,剩余结果完全符合「缺失1/2/3任意一个值即返回」的要求,查询语句如下:

{
  "query": {
    "bool": {
      "must_not": [
        {
          "term": {
            "user.userDatas.user_roles": 1
          }
        },
        {
          "term": {
            "user.userDatas.user_roles": 2
          }
        },
        {
          "term": {
            "user.userDatas.user_roles": 3
          }
        }
      ]
    }
  }
}

补充说明

  • 上述查询默认会返回所有不符合「同时含1、2、3」的文档,覆盖三类场景:
    • 数组缺失1、2、3中任意一个值的文档
    • 数组缺失1、2、3中多个值的文档
    • 不存在user.userDatas.user_roles字段的文档
  • 如果不需要返回字段不存在的文档,可以额外在filter子句中增加字段存在性判断,语句如下:
{
  "query": {
    "bool": {
      "must_not": [
        {
          "term": {
            "user.userDatas.user_roles": 1
          }
        },
        {
          "term": {
            "user.userDatas.user_roles": 2
          }
        },
        {
          "term": {
            "user.userDatas.user_roles": 3
          }
        }
      ],
      "filter": [
        {
          "exists": {
            "field": "user.userDatas.user_roles"
          }
        }
      ]
    }
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 14:15:42