Как устранить ошибку Elasticsearch при поиске по LocalDate.MAX?

#elasticsearch #spring-data-elasticsearch

Вопрос:

Я использую Spring Data Elasticsearch для поиска чего-то промежуточного 2010-01-01 и LocalDate.MAX что не удается с:

 nested: ElasticsearchException[Elasticsearch exception [type=arithmetic_exception, reason=long overflow]]
 

Имеющий springDataElasticsearchRepository.findByAgeBetween(startLocalDate, endLocalDate) .

Какова максимальная дата, которую принимает Elasticsearch, или как иначе избежать этой ошибки?

Ответ №1:

Elasticsearch хранит даты в виде длинных значений, представляющих миллисекунды с начала эпохи. Если вы запустите следующий код

 public static void main(String[] args) {
    long maxLong = Long.MAX_VALUE;
    Instant instant = Instant.ofEpochMilli(maxLong);
    ZonedDateTime zonedDateTime = instant.atZone(ZoneId.of("UTC"));
    LocalDate localDate = LocalDate.from(zonedDateTime);
    System.out.println(localDate);
}
 

вы получите

  292278994-08-17
 

в качестве максимальной представимой даты. Максимальное LocalDate значение составляет

  999999999-12-31
 

Ответ №2:

Использование springDataElasticsearchRepository.findByAgeBetween(Optional<LocalDate> startLocalDate, Optional<LocalDate> endLocalDate) позволяет избежать LocalDate.MIN и LocalDate.MAX которые вызывают проблемы.