# Exists Query(非空值查询)

原文链接 : [https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-exists-query.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-exists-query.html)

译文链接 : [http://www.apache.wiki/pages/viewpage.action?pageId=4260628](http://www.apache.wiki/pages/viewpage.action?pageId=4260628)

贡献者 : @小布丁

返回在原始字段中至少有一个非空值的文档：

```
GET /_search
{
    "query": {
        "exists" : { "field" : "user" }
    }
}
```

例如，这些文档都将匹配上面的查询：

```
{ "user": "jane" }
{ "user": "" } ①
{ "user": "-" } ②
{ "user": ["jane"] }
{ "user": ["jane", null ] } ③
```

①空字符串是 **non-null** （非空值）。

②即使通过 **standard analyzer** 标准分析器也不会发出警告，原始字段也是非空的。

③至少需要一个 **non-null** 非空值。

这些文档将不会被上面的查询匹配到：

```
{ "user": null }
{ "user": [] } ①
{ "user": [null] } ②
{ "foo":  "bar" } ③
```

①这个字段没有任何值。

②至少需要一个 **non-null** 非空值。

③ user 字段完全丢失。

##  null_value mapping （非空值映射）

如果字段映射包括 [**null_value**](https://www.elastic.co/guide/en/elasticsearch/reference/current/null-value.html) （空值）设置，那么明确的 **null** （空对象）将替换为指定的 **null_value** （空值）。

例如：user 字段映射如下：

```
  "user": {
    "type": "text",
    "null_value": "_null_"
  }
```

那么明确的 **null** （空对象）将被索引为字符串 “_null_” ，并且以下文档将被 **exists** （非空值）筛选器匹配：

```
{ "user": null }
{ "user": [null] }
```

但是，这些文档没有明确的 **null** （空对象）值，在 user 字段中也没有值，并且将不能被 **exists** （非空值）筛选器匹配：

```
{ "user": [] }
{ "foo": "bar" }
```

##  missing query （缺失查询）

** missing query** （缺失查询）已被废弃，因为它可以方便的由 **must_not** 子句中的 **exists** 查询替换，如下所示：

```
GET /_search
{
    "query": {
        "bool": {
            "must_not": {
                "exists": {
                    "field": "user"
                }
            }
        }
    }
}
```

此查询返回在 user 字段中没有值的文档。