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

问题描述 投票:0回答:1

我将 Logstash 与 Elasticsearch 结合使用,因此 @timestamp 字段是必填文档字段。

@timestamp
字段的值始终为 ISO8601 格式。

来自 Logstash 的一些 events/documents 没有特殊的

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
_id
属性正在工作。它采用字段
myid
的值并将其应用于
_id

现在,继续

_timestamp
。这就是它变得奇怪的地方。它不仅不采用
@timestamp
(2014-12-16T13:47:09.703Z) 的值,而是采用special timestamp 字段 的值(如前所述,这是从 grok 解析原始字段中获得的字段日志消息),然后将其转换为毫秒。

期望的结果是

_timestamp
将采用
@timestamp
持有的任何值。有人可以告诉我这是怎么回事吗?以前有人经历过吗?称为
timestamp
的字段和 Elastic Search 的
_timestamp
字段之间是否存在某种冲突?

elasticsearch timestamp logstash
1个回答
0
投票

在 Elasticsearch 内部,所有日期都存储为 Epoch 毫秒 - 因此

_timestamp
格式看起来不错。

使用 Epoch 转换器

1418737629000
的时间戳转换为
Tue, 16 Dec 2014 13:47:09 GMT
.

这看起来非常接近您的

@timestamp
值 - 毫秒已被删除,仅此而已。可能是时区变化让您感到困惑?

© www.soinside.com 2019 - 2024. All rights reserved.