elasticsearch - 日期格式需要恰好 3 位小数
elasticsearch - Date format requires exactly 3 decimals
我在 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",
"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
作为格式。
我在 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",
"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
作为格式。