elasticsearch - 日期格式需要恰好 3 位小数

elasticsearch - Date format requires exactly 3 decimals

我在 elasticsearch 7.10.1 中遇到日期解析问题。

这是索引的(相关部分)映射:

"utcTime": {
  "type": "date",
  "format": "strict_date_optional_time_nanos"
}

Date format reference.

部分文件已被接受,例如包含以下内容的文件:

"utcTime": "2021-02-17T09:50:13.173Z"
"utcTime": "2021-02-17T09:51:44.158Z"

请注意,在这两种情况下,秒都有 3 位小数。

另一方面,这被拒绝了:

"utcTime": "2021-02-17T09:51:45.07Z"

illegal_argument_exception: failed to parse date field [2021-02-17T09:51:45.07Z] with format [yyyy-MM-dd''T''HH:mm:ss.SSSXX]

在这种情况下,只有两位小数。我正在使用 Newtonsoft's JSON.net 进行序列化,其格式应始终包含 3 位小数,但它似乎并没有这样做。不过,它最多包含 3 位小数。

如何让 elasticsearch 接受秒数在 0 到 3 位小数之间的日期格式?

编辑

我终于找到问题了,它与映射无关,而是与管道处理器有关 date_index_name

PUT _ingest/pipeline/test_reroute_pipeline
{
  "description" : "Route documents to another index",
  "processors" : [
    {
      "date_index_name": {
        "field": "utcTime",
        "date_rounding": "d",
        "index_name_prefix": "rerouted-"
      }
    }
  ]
}

因为没有定义date_format参数,它会记住收到的第一个日期的格式。如果是2位小数,每次都需要2位。如果是3,就需要三个。

指定日期格式彻底解决了问题:

PUT _ingest/pipeline/test_reroute_pipeline
{
  "description" : "Route documents to another index",
  "processors" : [
    {
      "date_index_name": {
        "field": "utcTime",
        "date_rounding": "d",
        "index_name_prefix": "rerouted-",
        "date_formats": ["ISO8601"]
      }
    }
  ]
}

我刚刚尝试了一个全新的 7.10.1 集群,它也接受了秒部分的 1、2、3 位小数。

查看您收到的错误消息

illegal_argument_exception: failed to parse date field [2021-02-17T09:51:45.07Z] with format [yyyy-MM-dd''T''HH:mm:ss.SSSXX]

似乎设置的格式是yyyy-MM-dd''T''HH:mm:ss.SSSXX,它不同于strict_date_optional_time_nanos,后者是yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ

如果您检查索引中的真实映射,我很确定 utcTime 字段没有 strict_date_optional_time_nanos 作为格式。