web-dev-qa-db-ja.com

elasticsearch-painless-日付を操作する

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].をスローします

ありがとう

7
Eran H.

解決策は.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);

ここ は、無痛でサポートされている関数のリストです。

24
Eran H.