【问题标题】:understanding how elasticsearch stores dates internally了解 elasticsearch 如何在内部存储日期
【发布时间】:2015-03-30 08:40:00
【问题描述】:

我想了解 ES 如何在其索引中内部存储日期值。它会转换为 UTC 吗?

我有一个日期类型的字段“t”。这是映射:

"t": { "type" : "date" },

现在,当我向 ES 插入/添加文档时,它如何存储在其索引中。

  1. "t" : "1427700477165"(从 Date.now() 函数生成的毫秒数)。 ES 是否以 UTC 识别其纪元时间并按原样存储?

  2. "t" : "2015-03-29T23:59:59"(我相应地调整映射日期格式)- ES 如何存储它。如果它转换为 UTC,它如何知道这个日期是哪个时区并将其转换为 UTC? ES 是否从其运行的机器上获取默认时区?

谢谢!

【问题讨论】:

    标签: datetime elasticsearch lucene


    【解决方案1】:

    在内部(在索引内)Elasticsearch 将所有日期存储为纪元格式的数字 - 即自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒数。

    但默认情况下,Elasticsearch 也会存储您发布的原始 JSON 消息 - 因此,当返回 _source 时,您会看到发布到 Elasticsearch 的任何内容。

    为了能够将日期字符串导入纪元格式,您需要在映射中指定格式,例如 predefined date format:

    "t": { "type" : "date", "format" : "basic_date_time" }
    

    yyyyMMdd'T'HHmmss.SSSZ

    或指定custom date format

    "t": { "type" : "date", "format" : "YYYY-MM-dd" }
    
    • 如果未指定格式,则使用的默认日期解析为 ISODateTimeFormat.dateOptionalTimeParser
    • 可以在映射中指定多种日期格式 - 例如yyyy/MM/dd HH:mm:ss||yyyy/MM/dd
    • 如果未指定时区,则 Elasticsearch 假定 UTC

    【讨论】:

    • 让我们考虑一下“格式”:“yyyyMMdd'T'HHmmss”。它没有时区信息。 ES 将此日期视为哪个时区?
    • 如果没有给出时区信息,Elasticsearch 假定 UTC
    猜你喜欢
    • 2016-10-26
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    相关资源
    最近更新 更多