Null value(空值)

null_value 映射参数允许您在索引期间将显式的 null 值替换为预定义的替代值。默认情况下,如果字段设置为 null,它不会被索引,也无法被搜索。定义 null_value 后,将索引指定的替代值。这使您能够查询或聚合原本为 null 的字段的文档,而无需修改文档的 _source

null_value 必须与其应用的字段类型相同。例如,date 字段不能使用布尔值(如 true)作为其 null_valuenull_value 必须是有效的日期字符串。

在字段上设置 null_value

以下请求创建一个名为 products 的索引。category 字段为 keyword 类型,并在索引期间将 null 值替换为 "unknown"

PUT /products
{
  "mappings": {
    "properties": {
      "category": {
        "type": "keyword",
        "null_value": "unknown"
      }
    }
  }
}

索引一个包含空值的文档

使用以下命令索引一个 category 字段设置为 null 的文档:

PUT /products/_doc/1
{
  "category": null
}

查询空值替代

使用以下命令搜索 category 字段原本为 null 的文档:

POST /products/_search
{
  "query": {
    "term": {
      "category": "unknown"
    }
  }
}

响应包含匹配的文档:

{
  ...
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 0.2876821,
    "hits": [
      {
        "_index": "products",
        "_id": "1",
        "_score": 0.2876821,
        "_source": {
          "category": null
        }
      }
    ]
  }
}

对空值替代进行聚合

由于空值替代被索引,它也会出现在聚合结果中。使用以下命令对 category 字段执行 terms 聚合:

POST /products/_search
{
  "size": 0,
  "aggs": {
    "category_count": {
      "terms": {
        "field": "category"
      }
    }
  }
}

响应包含聚合结果:

{
  ...
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": null,
    "hits": []
  },
  "aggregations": {
    "category_count": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "unknown",
          "doc_count": 1
        }
      ]
    }
  }
}