elasticsearch-painless - 操纵日期
elasticsearch-painless - Manipulate date
我正在尝试使用 elasticsearch 的脚本语言 painless
来操作日期。
具体来说,我正在尝试添加 4 小时,即 14,400 秒。
{
"script_fields": {
"new_date_field": {
"script": {
"inline": "doc['date_field'] + 14400"
}
}
}
}
这会抛出 Cannot apply [+] operation to types [org.elasticsearch.index.fielddata.ScriptDocValues.Longs] and [java.lang.Integer].
谢谢
解决方案是使用 .value
{
"script_fields": {
"new_date_field": {
"script": {
"inline": "doc['date_field'].value + 14400"
}
}
}
}
然而,我实际上想用它来重建索引,格式有点不同。
这是我在 _reindex
api
中操纵时间的版本
POST _reindex
{
"source": {
"index": "some_index_v1"
},
"dest": {
"index": "some_index_v2"
},
"script": {
"inline": "def sf = new SimpleDateFormat(\"yyyy-MM-dd'T'HH:mm:ss\"); def dt = sf.parse(ctx._source.date_field); def calendar = sf.getCalendar(); calendar.setTime(dt); def instant = calendar.toInstant(); def localDateTime = LocalDateTime.ofInstant(instant, ZoneOffset.UTC); ctx._source.date_field = localDateTime.plusHours(4);"
}
}
这是可读版本的内联脚本
def sf = new SimpleDateFormat(\"yyyy-MM-dd'T'HH:mm:ss\");
def dt = sf.parse(ctx._source.date_field);
def calendar = sf.getCalendar();
calendar.setTime(dt);
def instant = calendar.toInstant();
def localDateTime = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);
ctx._source.date_field = localDateTime.plusHours(4);
Here是painless支持的函数列表,很痛苦。
补充。将日期转换为字符串,我相信您的第一部分可以通过以下方式完成:
def dt = String.valueOf(ctx._source.date_field);
刚花了几个小时玩这个..所以我可以将日期字段(以UTC格式添加00:00:00)..连接到带有时间的字符串,以获得有效的日期时间添加到 ES。不要问它为什么被拆分..它是一个旧的 Oracle 系统
我正在尝试使用 elasticsearch 的脚本语言 painless
来操作日期。
具体来说,我正在尝试添加 4 小时,即 14,400 秒。
{
"script_fields": {
"new_date_field": {
"script": {
"inline": "doc['date_field'] + 14400"
}
}
}
}
这会抛出 Cannot apply [+] operation to types [org.elasticsearch.index.fielddata.ScriptDocValues.Longs] and [java.lang.Integer].
谢谢
解决方案是使用 .value
{
"script_fields": {
"new_date_field": {
"script": {
"inline": "doc['date_field'].value + 14400"
}
}
}
}
然而,我实际上想用它来重建索引,格式有点不同。
这是我在 _reindex
api
POST _reindex
{
"source": {
"index": "some_index_v1"
},
"dest": {
"index": "some_index_v2"
},
"script": {
"inline": "def sf = new SimpleDateFormat(\"yyyy-MM-dd'T'HH:mm:ss\"); def dt = sf.parse(ctx._source.date_field); def calendar = sf.getCalendar(); calendar.setTime(dt); def instant = calendar.toInstant(); def localDateTime = LocalDateTime.ofInstant(instant, ZoneOffset.UTC); ctx._source.date_field = localDateTime.plusHours(4);"
}
}
这是可读版本的内联脚本
def sf = new SimpleDateFormat(\"yyyy-MM-dd'T'HH:mm:ss\");
def dt = sf.parse(ctx._source.date_field);
def calendar = sf.getCalendar();
calendar.setTime(dt);
def instant = calendar.toInstant();
def localDateTime = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);
ctx._source.date_field = localDateTime.plusHours(4);
Here是painless支持的函数列表,很痛苦。
补充。将日期转换为字符串,我相信您的第一部分可以通过以下方式完成:
def dt = String.valueOf(ctx._source.date_field);
刚花了几个小时玩这个..所以我可以将日期字段(以UTC格式添加00:00:00)..连接到带有时间的字符串,以获得有效的日期时间添加到 ES。不要问它为什么被拆分..它是一个旧的 Oracle 系统