elasticsearch - 日期格式正好需要 3 个小数

问题描述

我在 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","index_name_prefix": "rerouted-","date_formats": ["ISO8601"]
      }
    }
  ]
}

解决方法

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

查看您收到的错误消息

illegal_argument_exception:无法解析格式为 [yyyy-MM-dd''T''HH:mm:ss.SSSXX] 的日期字段 [2021-02-17T09:51:45.07Z]

貌似设置的格式是strict_date_optional_time_nanos,和yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ不同的是utcTime

如果您检查索引中的真实映射,我很确定 strict_date_optional_time_nanos 字段没有 public static class QuartzUtils { public static async Task<JobKey> CreateSingleJob<JOB>(this IScheduler scheduler,string jobName,object data) where JOB : IJob { var jm = new JobDataMap { { "data",data } }; var jobKey = new JobKey(jobName); await scheduler.ScheduleJob( JobBuilder.Create<JOB>() .WithIdentity(jobKey) .Build(),TriggerBuilder.Create() .WithIdentity(jobName) .UsingJobData(jm) .StartNow() .Build()); return jobKey; } } 作为格式。