9

我正在尝试使用 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].

谢谢

4

2 回答 2

35

解决方案是使用.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);

是painless支持的功能列表,很痛苦。

于 2017-08-24T14:28:32.723 回答
0

增加项。将日期转换为字符串,我相信您的第一部分可以通过以下方式完成:

def dt = String.valueOf(ctx._source.date_field);

刚刚花了几个小时玩这个..所以我可以连接一个日期字段(以UTC格式添加00:00:00)..到一个带有时间的字符串,以获得一个有效的日期时间添加到ES。不要问它为什么被拆分.. 它是一个旧的 Oracle 系统

于 2021-01-05T18:25:33.610 回答