原英文版地址: https://www.elastic.co/guide/en/elasticsearch/reference/7.7/date_nanos.html, 原文档版权归 www.elastic.co 所有
本地英文版地址: ../en/date_nanos.html

date_nanos(日期纳秒)数据类型

该数据类型是对date数据类型的补充。 然而,这两者之间有一个重要的区别。 现有的date数据类型以毫秒为分辨率存储日期。 date_nanos数据类型以纳秒为分辨率存储日期,这将其日期范围限制在大约1970年到2262年之间,因为日期仍然存储为长整型类型,表示自纪元以来的纳秒。

对纳秒的查询在内部转换为对这种长整型表示形式的范围查询,聚合的结果和存储的字段根据与字段相关联的日期格式转换回字符串。

可以自定义日期格式,但是如果没有指定format,则使用默认格式:

"strict_date_optional_time||epoch_millis"

这意味着它将接受带有可选时间戳的日期,这些时间戳符合strict_date_optional_time支持的格式,包括最多九个小数的秒或自纪元以来的毫秒数(因此失去了纳秒部分的精度)。

这意味着它将接受带有可选时间戳的日期,这些时间戳符合strict_date_optional_time或 自纪元以来的毫秒数(milliseconds-sin-the-epoch)支持的格式。

例如:

PUT my_index?include_type_name=true
{
  "mappings": {
    "_doc": {
      "properties": {
        "date": {
          "type": "date_nanos" 
        }
      }
    }
  }
}

PUT my_index/_doc/1
{ "date": "2015-01-01" } 

PUT my_index/_doc/2
{ "date": "2015-01-01T12:10:30.123456789Z" } 

PUT my_index/_doc/3
{ "date": 1420070400 } 

GET my_index/_search
{
  "sort": { "date": "asc"} 
}

GET my_index/_search
{
  "script_fields" : {
    "my_field" : {
      "script" : {
        "lang" : "painless",
        "source" : "doc['date'].value.nano" 
      }
    }
  }
}

GET my_index/_search
{
  "docvalue_fields" : [
    {
      "field" : "date",
      "format": "strict_date_time" 
    }
  ]
}

字段date使用默认的format

这个文档使用普通日期。

这个文档包含时间。

这个文档使用自纪元以来的毫秒数。

注意,返回的sort值都是自纪元以来的纳秒。

在脚本中访问日期的纳秒部分

使用文档值字段,它可以以纳秒级的分辨率进行格式化

可以指定多种格式,用||作为分隔符将它们分隔开。 可以使用与date字段相同的映射参数。

局限性

即使使用date_nanos字段,聚合仍然只有毫秒级分辨率。 这种限制也会影响transforms