目录

Elasticsearch时间类型总结

概述

Elasticsearch 可以写入、查询不同的时间类型,但当遇到 Unix 时间戳和其他时间格式的时候会有点混乱,因此本文主要是总结一下各种时间类型和其他的表示方式。

日期类型

JSON 没有日期类型,因此在 Elasticsearch 中可以表达成:

  1. 日期格式化的字符串,比如: “2015-01-01” 或者 “2015/01/01 12:10:30”;
  2. 毫秒级别的 long 类型或秒级别的 integer 类型,比如: 1515150699465, 1515150699;

实际上不管日期以何种格式写入,在 ES 内部都会先穿换成 UTC 时间并存储为 long 类型。

日期格式可以自定义,如果没有指定的话会使用以下的默认格式: "strict_date_optional_time||epoch_millis"

因此总结来说,不管哪种可以表示时间的格式写入,都可以用来表示时间!请利用 Kibana 或者 ES 的 RESTful API 来写入文档,并且进行最后的查询。你就会发现用不同时间格式写入的数据,都可以用 ES 来进行查询、排序。

/elasticsearch%E6%97%B6%E9%97%B4%E7%B1%BB%E5%9E%8B%E6%80%BB%E7%BB%93/image_1c7gqnjb21auf1ghb19hc192iur19.png
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "date": {
          "type": "date" 
        }
      }
    }
  }
}

PUT my_index/_doc/1
{ "date": "2015-01-01" } 

PUT my_index/_doc/2
{ "date": "2015-01-01T12:10:30Z" } 

PUT my_index/_doc/3
{ "date": 1420070400001 } 

GET my_index/_search
{
  "sort": { "date": "asc"} 
}

同时定义多种日期格式

在构建 mapping 的时候,可以通过用 || 分隔符,把多种日期格式写入,而在写入的时候,每种格式都会依次尝试转换,直到有匹配的为止。下面例子中可以,第一种格式就会尝试把毫秒值转换为 string

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "date": {
          "type":   "date",
          "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
        }
      }
    }
  }
}

日期格式

尽管在 JSON 文档里,日期都会用字符串来表示,但是 ES 内置了很多不同的日期格式用来把这些表示时间的字符串解析成日期格式。此外,除了内置的格式以外,用户还可以通过例如 yyyy/MM/dd 这样的语法用来解析日期。

总结

往 ES 写入时间类型的数据的时候,可以写入不同的时间格式的值,最终在 ES 中都会转化成 long 类型用于查询和排序。

参考资料

  1. Elasticsearch官方文档-date
  2. Elasticsearch官方文档-mapping-date-format
警告
本文最后更新于 2017年2月1日,文中内容可能已过时,请谨慎参考。