Сценарии Elasticsearch - конвертировать временную метку unix в ГГГГММ

Я использую Elasticsearch 2.4 и скрипт Groovy. В моем документе есть поле doc['created_unix_timestamp'] типа integer, которое содержит временную метку Unix. В сценарии поискового запроса я пытаюсь получить YYYYMM из этого значения.

Например, если doc['created_unix_timestamp'] равно 1522703848, то в сценарии во время расчета я хочу преобразовать его в 201804, где первые 4 цифры — это год, а последние две — месяц (с добавлением 0, если требуется)

Я старался:

Integer.parseInt(new SimpleDateFormat('YYYYMM').format(new Date(doc['created_unix_timestamp'])))

Но выдает "ошибку компиляции" "TransportError(400, 'search_phase_execution_exception', 'failed to compile groovy script')" . Любая идея, как заставить его работать или каков правильный синтаксис?


person JVK    schedule 02.04.2018    source источник
comment
Может быть, вам не хватает импорта в SimpleDateFormat? Вы пробовали более похожий на Groovy подход - (new Date(doc.created_unix_timestamp).format('yyyyMM')).toInteger() ?   -  person Szymon Stepniak    schedule 03.04.2018
comment
@SzymonStepniak Предложение Groovy не вызывает никаких ошибок компиляции :), но дает неправильный результат. например return (new Date(1522703848).format('yyyyMM')).toInteger() вернуть 197001 то есть январь 1970 года, хотя должен был быть 201804   -  person JVK    schedule 03.04.2018
comment
@SzymonStepniak во время отладки я обнаружил, что new Date(1522703848).format('yyyyMM') это равно None   -  person JVK    schedule 03.04.2018
comment
@SzymonStepniak У меня получилось. Поскольку конструктор Date ожидает в миллисекундах docs.oracle.com/javase/6/docs/api/java/util/ , поэтому я изменил строку на (new Date(1522705958L*1000).format('yyyyMM')).toInteger(), и это сработало. Спасибо за помощь.   -  person JVK    schedule 03.04.2018


Ответы (2)


Пара рекомендаций.

  1. Переиндексируйте и сделайте created_unix_timestamp настоящей датой в elasticsearch. Это сделает возможными все виды новых запросов (например, диапазон дат). Это было бы идеально.

  2. Если вы не можете переиндексировать, а затем вернуть его как int из ES, а затем преобразовать его во что угодно на стороне клиента, я бы не рекомендовал отправлять эту работу в кластер ES.

person jhilden    schedule 02.04.2018

Согласно предложению Шимона Степняка в комментарии выше, я решил эту проблему с помощью

(new Date(1522705958L*1000).format('yyyyMM')).toInteger()

Благодарим и отдаем должное Шимону Степняку

person JVK    schedule 03.04.2018