为什么我不能在弹性搜索索引模板中将@timestamp映射到_timestamp?

时间:2014-12-16 16:57:10

标签: elasticsearch timestamp logstash

我正在使用带有Elasticsearch的Logstash,因此,@ timestamp字段是必填文档字段。 @timestamp字段的值始终为ISO8601格式。

来自Logstash的某些事件 / 文档没有特殊的timestamp字段(请不要将其与_timestamp字段;这是从grok解析获得的另一个字段)所以我决定使用以下索引模板将@timestamp映射到_timestamp

{
  "settings" : {...},
  "template" : "logstash-myindex-*",
  "mappings": {
    "_id" : {
      "path": "myid"
    },
    "_timestamp" : {
      "enabled" : true,
      "stored" : true,
      "path" : "@timestamp",
      "format": "YYYY-MM-dd'T'HH:mm:ss.SSS'Z'"
    },
    "property" : {
      "@timestamp" : {
        "type": "date",
        "format": "YYYY-MM-dd'T'HH:mm:ss.SSS'Z'"
      },
      "myid" : {
        "type": "string",
        "index": "not_analyzed"
      }
    }
  }
}

当我进行搜索时:

POST logstash-myindex-2014.12.16/_search
{
  "fields": ["_timestamp", "_source"],
  "query": {
    "match_all": {}
  }
}

我这样得到结果(只显示一个示例文档):

{
    "_id": "AUeo39n78xpe_2ggb", 
    "_index": "logstash-myindex-2014.12.16", 
    "_score": 1.0, 
    "_source": {
      "@timestamp": "2014-12-16T13:47:09.703Z", 
      "@version": "1", 
      "myid": "AUeo39n78xpe_2ggb"
      "timestamp": 1418737629,
    }, 
    "_type": "logs",
    "fields": {
      "_timestamp": 1418737629000
    }
} 

好的,在这里您可以看到path的{​​{1}}属性正常工作。它采用字段_id的值并将其应用于myid

现在,转到_id。这是它变得奇怪的地方。它不仅没有取_timestamp(2014-12-16T13:47:09.703Z)的值,而是采用特殊时间戳字段的值(如上所述,这是一个从grok解析原始日志消息获得的字段)然后将其转换为毫秒。

期望的结果是@timestamp将假设任何值_timestamp成立。有人可以告诉我这里发生了什么吗?以前有人经历过吗?名为@timestamp的字段与弹性搜索的timestamp字段之间是否存在某种冲突?

1 个答案:

答案 0 :(得分:0)

在Elasticsearch的内部,所有日期都存储为Epoch毫秒 - 因此_timestamp格式看起来不错。

使用Epoch converter 1418737629000的时间戳转换为Tue, 16 Dec 2014 13:47:09 GMT

这看起来非常接近你的@timestamp值 - 毫秒被删除,就是这样。可能会有一个时区的改变让你失望?