问题描述
我在 elasticsearch 7.10.1 中解析日期时遇到问题。
这是索引的映射(相关部分):
"utcTime": {
"type": "date","format": "strict_date_optional_time_nanos"
}
接受部分文件,例如带有:
"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;
}
}
作为格式。