exists 判定字段是否存在
exists 查询匹配「字段存在且至少有一个非空值」的文档。三种情况都不算存在:字段从未写入、值是 JSON null、数组为空数组。它和 SQL 的 IS NOT NULL 直觉相近但不完全一致——空字符串、数字 0、布尔 false 都算存在,因为它们都是有效标量值。
基本信息
| 接口 | { "exists": { "field": "user" } } |
|---|---|
| 不匹配的情况 | 字段未写入、值为 null、数组为空数组 |
| 匹配的情况 | 空字符串、数值 0、布尔 false 都算存在 |
| 组合用法 | bool 的 must_not 加 exists 查出缺字段的文档 |
| 嵌套与数组 | object 父字段只要有一个子字段被索引就算存在;nested 字段必须放进 nested 查询 |
典型使用场景
- 数据质量巡检:找出缺少关键字段的文档并统计缺口比例
- 数据补全:先定位缺 email、缺标签的记录,再批量回填
- 索引重建后校验:确认新索引没有丢字段或丢值
- 条件统计:按「是否带某字段」分桶看分布
- 权限过滤:确保只返回带租户标识的文档
常用写法
常用写法
# 查带 email 字段的文档
GET /my-index/_search
{ "query": { "exists": { "field": "email" } } }
# 查缺 email 字段的文档,用于补数据
GET /my-index/_search
{ "query": { "bool": { "must_not": [ { "exists": { "field": "email" } } ] } } }
# 只看缺口数量,不返回文档正文
GET /my-index/_count
{ "query": { "bool": { "must_not": [ { "exists": { "field": "email" } } ] } } }
# nested 字段的存在性判断必须包在 nested 查询里
GET /my-index/_search
{ "query": { "nested": { "path": "comments", "query": { "exists": { "field": "comments.author" } } } } }字段值与判定结果
| 字段值 | exists 是否匹配 | 说明 |
|---|---|---|
| "abc" | 匹配 | 非空标量值 |
| "" 空字符串 | 匹配 | 空字符串仍然是有值 |
| 0 / false | 匹配 | 数值 0 与布尔 false 都是有效值 |
| null | 不匹配 | 表现与字段缺失完全一致 |
| [] 空数组 | 不匹配 | 数组内没有任何元素 |
| {} 空对象 | 不匹配 | 没有任何子字段被索引进去 |
object 类型字段只要有一个子字段写入就算存在,因此用 exists 查父字段无法判断整个子对象是否完整;需要精确判断时应改查具体子字段。
exists 判定依赖字段的存在性元数据,字段数量极多时逐字段判定开销会上升;在大索引上做全量缺口统计,建议先用时间范围或业务分区把文档量缩小,再统计缺失比例。