我有一组时间戳,格式为自纪元以来的秒数。我想以onClick
的形式插入ElasticSearch,但是当查询时希望将输出看作一个漂亮的日期,例如epoch_seconds
。
我的下面的映射保留了输入所带来的格式 - 有没有办法通过mapping api将输出规范化为一种格式?
当前映射:
strict_date_optional_time
示例文档
PUT example
{
"mappings": {
"time": {
"properties": {
"time_stamp": {
"type": "date",
"format": "strict_date_optional_time||epoch_second"
}
}
}
}
}
获取示例/ _search输出:
POST example/time
{
"time_stamp": "2018-03-18T00:00:00.000Z"
}
POST example/time
{
"time_stamp": "1521389162" // Would like this to output as: 2018-03-18T16:05:50.000Z
}
答案 0 :(得分:1)
Elasticsearch区分_source
和所谓的存储字段。第一个应该代表你的意见。
如果您实际使用存储的字段(通过在映射中指定store=true
),请指定multiple date formats这很容易:(强调我的)
可以通过||分隔多种格式来指定作为分隔符。将依次尝试每种格式,直到找到匹配的格式。 第一种格式将用于将毫秒 - 自 - 纪元值转换回字符串。
我已经使用elasticsearch 5.6.4进行了测试,并且工作正常:
PUT /test -d '{ "mappings": {"doc": { "properties": {"post_date": {
"type":"date",
"format":"basic_date_time||epoch_millis",
"store":true
} } } } }'
PUT /test/doc/2 -d '{
"user" : "test1",
"post_date" : "20150101T121030.000+01:00"
}'
PUT /test/doc/1 -d '{
"user" : "test2",
"post_date" : 1525167490500
}'
注意使用GET /test/_search?stored_fields=post_date&pretty=1
{
"hits" : [
{
"_index" : "test",
"_type" : "doc",
"_id" : "2",
"_score" : 1.0,
"fields" : {
"post_date" : [
"20150101T111030.000Z"
]
}
},
{
"_index" : "test",
"_type" : "doc",
"_id" : "1",
"_score" : 1.0,
"fields" : {
"post_date" : [
"20180501T093810.500Z"
]
}
}
]
}
如果您想更改输入(在_source
中),那么您还不是很幸运,mapping-transform功能已被移除:
这在2.0.0中已弃用,因为它使调试变得非常困难。截至目前,除了在客户端应用程序中转换文档之外,确实没有其他功能可供使用。
如果您不想更改存储数据,而是想对格式化输出感兴趣,请查看this answer to Format date in elasticsearch query (during retrieval)