Преобразование часового пояса скрипта агрегации терминов ElasticSearch

Я действительно борюсь с этим. В Painless, как бы я обновил следующее:

 "aggs": {
    "total_messages_per_day_of_week": {
      "terms": {
        "script": {
          "lang": "painless",
          "source": "doc['date'].value.dayOfWeek"
        }
      },

Чтобы преобразовать дату и время UTC в doc.date в локаль (например, «Америка / Лос-Анджелес») ДО получения дня недели?

В основном я хочу агрегировать по номеру дня, но где номер дня представляет желаемый день часового пояса, а не день UTC.

Спасибо заранее!


person InTooDeep    schedule 30.09.2020    source источник


Ответы (1)


Вы бы сделали это так, сначала преобразовав дату UTC в ZonedDateTime через Instant.atZone(), а затем взяв день недели:

Instant date = Instant.ofEpochMilli(doc['timestamp'].value);
ZonedDateTime zdt = date.atZone(ZoneId.of('America/Los_Angeles'));
return zdt.getDayOfWeek().getValue();

И поскольку doc.date.value на самом деле JodaCompatibleZonedDateTime (т. е. делегат ZonedDateTime), в вашей агрегации вы можете попробовать следующее:

{
  ...,
  "aggs": {
    "days": {
      "terms": {
        "script": "doc['timestamp'].value. withZoneSameInstant(ZoneId.of('America/Los_Angeles')).getDayOfWeek().getValue()"
      }
    }
  }
}
person Val    schedule 30.09.2020
comment
Спасибо, только что попробовал это с: aggs: { период: { условия: { сценарий: { источник: Instant.ofEpochMilli (doc ['timestamp']. value). atZone (ZoneId.of ('America/Los_Angeles')). getDayOfWeek ().getValue(), lang:painless } }, 'timestamp' - это фактическое поле, а не дата. Я получаю следующую ошибку: неправильное_метод_типа_исключение: не удается преобразовать MethodHandle(Dates)JodaCompatibleZonedDateTime в (Object)long - person InTooDeep; 30.09.2020
comment
Что вы имеете в виду под 'timestamp' is the actual field, not date? - person Val; 30.09.2020
comment
Я имею в виду, что имя свойства, в котором хранится дата в документе, — «отметка времени». Я использовал «дату» выше, чтобы добавить ясности. Хотел убедиться, что ошибка имеет смысл для вас. Спасибо - person InTooDeep; 30.09.2020
comment
Хорошо, имеет смысл. Смотрите мой обновленный ответ, он должен работать - person Val; 30.09.2020
comment
Это блестяще. Спасибо за помощь. Очень ценю. - person InTooDeep; 30.09.2020
comment
Круто, рад, что помогло! Остерегайтесь, однако, что сценарии могут снизить производительность. Если у вас есть какой-либо способ предварительно вычислить это и добавить новое поле дня для агрегирования, это будет намного быстрее (конечно, в зависимости от объема данных, на которых вы это запускаете) - person Val; 30.09.2020
comment
Да, именно мои мысли. Спасибо. - person InTooDeep; 30.09.2020
comment
Небольшая поправка - мне нужно было использовать withZoneSameInstant, а не withZoneSameLocal. См. stackoverflow.com/questions/55032725/ - person InTooDeep; 06.10.2020
comment
Очень хороший момент, который я упустил из виду! Я исправил проблему! Спасибо, что сообщили об этом ???? - person Val; 06.10.2020