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
相关产品推荐
相关产品推荐

