最近在优化一个小车里程统计的功能,之前同事是把数据存到es中,但是由于他把时间戳设计成了long类型,导致使用时间聚合统计的时候无法使用时区,具体可以参考es的isues:https://github.com/elastic/elasticsearch/issues/42270。参考其给出的建议需要把timestamp字段从long类型改成date类型。整体思路分为以下几步,操作的页面在kibana的Management->Dev tool
image.png
还有要注意的地方是在kibana页面,有时候看不到索引的文档,需要reflush刷新一下缓存,并不是文档没有写进去,而是没有加载出来。经验证下面的运行的脚本指令对7.8.0版本有效,对于低版本6.8.10则不起效果。工作中由于一台测试服务器使用的是6.8.10,后来使用docker升级到了7.8.0才起作用。
1. 新建索引
PUT log_car_milage_1
2. 指定新建索引的mapping(把timestamp字段从long类型改成date类型)
POST /log_car_milage_1/_mapping
{
"properties" : {
"deviceId" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"device_id" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"distance" : {
"type" : "long"
},
"milage" : {
"type" : "long"
},
"timestamp" : {
"type" : "date"
}
}
}
3. 从旧索引导入数据到新索引
POST _reindex
{
"source": {
"index": "log_car_milage"
},
"dest": {
"index": "log_car_milage_1",
}
}
4. 删除旧索引
DELETE /log_car_milage
5. 给新索引添加别名(旧索引的名称)
POST /_aliases
{
"actions": [
{ "add": {
"alias": "log_car_milage",
"index": "log_car_milage_1"
}}
]
}