背景
近期有个取数需求要按照ES中时间范围取值,发现之前的开发mapping里的字段是text,ES range API不支持text,需要把text转成时间戳long类型
解决思路
新建一个createTimeStamp字段,将之前的createTime text类型转成long类型后迁移进来,
了解到ES DSL语句支持内嵌java脚本,可以直接使用DSL搞定
代码如下
POST index/_update_by_query
{
"script": {
"source": """
if(ctx._source.createTime !=null && ctx._source.createTime !=""){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse(ctx._source.createTime );
ctx._source.createTimeStamp = date.getTime()/1000;
}
""",
"lang": "painless"
},
"query": {
"bool": {
"must_not": {
"exists": {
"field": "createTimeStamp"
}
}
}
}
}