【问题标题】:Malformed Date Error Indexing Data Into Elasticsearch将数据索引到 Elasticsearch 的格式错误的日期错误
【发布时间】:2017-12-14 18:57:16
【问题描述】:

我正在尝试在 elasticsearch 中为包含时区日期的数据建立索引。

我的日期映射是:

"date": {
    "type": "date",
    "format": "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
}

我使用以下代码来索引数据:

client.prepareIndex(INDEX, TYPE, id))
        .setSource(gson.toJson(object), XContentType.JSON)
        .setRefreshPolicy(RefreshPolicy.IMMEDIATE)
        .get();

我创建了自己的 ZonedDateTime 适配器,如下所示:

public class ZonedDateTimeAdapter implements JsonSerializer<ZonedDateTime> {

    public JsonElement serialize(ZonedDateTime date, Type typeOfSrc, JsonSerializationContext context) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
        return new JsonPrimitive(date.format(formatter));
    }

}

生成的日期类似于2005-01-01T13:35:50.596-0500。对我来说,这似乎与我的yyyy-MM-dd'T'HH:mm:ss.SSSZ 格式相匹配。但是我收到一条错误消息:

线程“main”中的异常 MapperParsingException[解析失败 [开始日期]];嵌套:IllegalArgumentException [无效格式: “2005-01-01T13:35:50.596-0500”在“.596-0500”处格式不正确]

有趣的是,如果我将 ZonedDateTimeAdapter 中的格式更改为 yyyy-MM-dd'T'HH:mm:ss.000Z(强制第二个分数始终为 000),我会得到类似 2005-01-01T13:31:06.000-0500 的结果日期。具有此日期的对象已成功索引到 elasticsearch。

你知道为什么2005-01-01T13:31:06.000-0500 索引成功但2005-01-01T13:35:50.596-0500 没有吗?这些不是一样的格式吗?

【问题讨论】:

    标签: java elasticsearch gson datetime-format datetime-parsing


    【解决方案1】:

    更新:我对我的 ES 5.2 进行了快速测试,它运行良好。

    $curl -XPUT localhost:9200/myindex1 -d '
    {"mappings": {"type1": {"properties": {"field1": {
        "type": "date", 
        "format": "yyyy-MM-dd'\''T'\''HH:mm:ss.SSSZ"
    }}}}}
    '
    
    $curl -XPUT localhost:9200/myindex1/type1/id1 -d '
        { "field1":"2005-01-01T13:35:50.000-0500" }
    '
    
    $curl -XPUT localhost:9200/myindex1/type1/id2 -d '
        { "field1":"2005-01-01T13:35:50.596-0500" }
    '
    

    确认我们有相同的映射:

    $curl localhost:9200/myindex1/type1/_mapping
    {"myindex1":{"mappings":{"type1":{"properties":
        {"field1":{"type":"date","format":"yyyy-MM-dd'T'HH:mm:ss.SSSZ"}}}}}}
    

    来自this thread on https://discuss.elastic.co

    目前,Elasticsearch 仅限于毫秒精度,请参阅GH issue

    该帖子来自 2015 年,但该问题仍未解决。似乎尚不支持纳秒精度。

    【讨论】:

    • 谢谢!但不是 .001 毫秒吗?而 .000000001 是纳秒?
    • 你说的完全正确。为我的疏忽道歉 - 我自然认为你正在做微/纳秒,因为我之前遇到过这个问题。也就是说,我尝试创建一个模拟索引(使用默认映射),插入两个文档,每个文档只有一个字段。一个具有价值2005-01-01T13:31:06.000-0500 和一个2005-01-01T13:31:06.596-0500。两个都插入成功。让我们看看您的映射是否导致了问题。
    • @Gabriel 我在本地 ES 5.2 上进行了尝试:创建了相同的映射,创建了索引,插入了两个具有这些值的文档,一切正常。我更新了答案以反映日志。您可以尝试一个简单的 curl 命令吗?这样您就可以将问题隔离到 ES 本身或 Java API。
    【解决方案2】:

    我不确定我的“修复”是否适合任何看到此问题的人。但情况越来越糟。我无法解析出任何以 0 结尾的日期。所以 yyyy-MM-dd'T'HH:mm:00yyyy-MM-dd'T'HH:00 会失败,但 yyyy-MM-dd'T'HH:mm:01yyyy-MM-dd'T'HH:01 会成功。我销毁了我的整个 elasticsearch 数据库并升级到 6.1 并重新索引了我的所有数据。我不再看到这个问题了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-03
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多