Игорь, спасибо, но есть нюанс:
у нас есть массив и несколько документов (с разными "_source"), которые необходимо обрабатывать и указывать в {{ctx.payload.diff}}, который у каждого будет свой.
К сожалению, понять все нюансы по 2 строчкам описания очень сложно. Если вы приведете подробный пример, вроде того, как я привел в своем ответе, который учитывает все ваши нюансы, то я вам с удовольствием помогу разобраться.
Скрипты в transform пишутся на языке painless. Там есть доступ к всех хитам через ctx.payload.hits.hits - это список, то есть ctx.payload.hits.hits[0]['_source'] - это все значение первого документа, ctx.payload.hits.hits[1]['_source'] - второго и т.д.
Есть проблема с выводом {{ctx.payload.new_date}} для нескольких документов.У них new_date разный (т.е. в каждом документе есть @buildTimestamp с разными значениями).
Требуется получить в action в "body " {{ctx.payload.new_date}} для нескольких документов. У них он разный - т.е. в каждом документе есть поле @buildTimestamp с разными датой и временем.
@buildTimestamp по трансформации равен ctx.new_date, который "вытащили" так:
Проблема в том, что у меня нет ваших данных, нет вашего маппинга и нет ключа telegram, чтобы протестировать решение. Поэтому я и привел пример, в котором есть все необходимое - данные и watcher с logging action. Мой пример может запустить кто угодно - он не требует никаких дополнительных установок. Я поэтому и хотел продолжить на моем примере.
В вашем случае, надо все поставить в цикл и возвращать массив дат.
В нашем случае, все надо поставить в цикл и возвращать массив из переменных diff и buildTimestamp с форматированием.
У нас есть скрипт из трансформа, в выводе которого diff мы получаем общий для всех элементов возвращаемых данных, а он должен быть для каждого элемента свой.
"source":
"DateFormat dateFormat = new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss z\");
dateFormat.setTimeZone(TimeZone.getTimeZone(\"Europe/Moscow\"));
Date date = new Date(); ctx.execution_time = dateFormat.format(date);
for (bucket in ctx.payload.hits.hits)
{
bucket.timestamp = bucket._source['@timestamp'];
bucket.buildTimestamp = bucket._source['@buildTimestamp'];
def dateString = ctx.payload.hits.hits[0]['_source']['@buildTimestamp'];
def inputFormat = new SimpleDateFormat(\"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'\");
def myDate = inputFormat.parse(dateString);
def outputFormat = new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss z\");
ctx.new_date = outputFormat.format(myDate);
}
Instant timestamp = Instant.parse(ctx.payload.hits.hits[0]['_source']['@timestamp']);
Instant buildTimestamp = Instant.parse(ctx.payload.hits.hits[0]['_source']['@buildTimestamp']);
return [
'new_date': ctx.new_date,
'human_date': ctx.execution_time,
'aggregations': ctx.payload.hits.hits,
'diff': Duration.between(buildTimestamp, timestamp).toMillis() ]",
Плюс к этому, нам надо отформатировать вывод поля buildTimestamp в цикле, так же для каждого документа в массиве по отдельности.
Как это сделать?
Apache, Apache Lucene, Apache Hadoop, Hadoop, HDFS and the yellow elephant
logo are trademarks of the
Apache Software Foundation
in the United States and/or other countries.