Поиск в Hibernate не возвращает никаких результатов, когда мы используем запросы в диапазоне дат в наши проиндексированные даты.
Все остальные запросы диапазона работают как ожидалось
Мы используем поиск в режиме гибернации поверх эластичного поиска, все наши запросы выполняются, как и ожидалось, кроме тех, где мы пытаемся найти даты в заданном диапазоне.
У нас есть другие запросы по диапазону веса, роста и т. Д., Которые работают как положено.
Изучая индекс с Люком, кажется, что даты проиндексированы, как и ожидалось.
У нас есть следующие доменные объекты, просто показывающие соответствующие поля
@Indexed
public class Person{
@IndexedEmbedded
@OneToMany(mappedBy = "person", fetch = FetchType.LAZY)
@Cascade({org.hibernate.annotations.CascadeType.PERSIST})
private Set<DateOfBirth> datesOfBirth = new HashSet<>();
}
public class DateOfBirth{
@Basic
@Field
@DateBridge(resolution = Resolution.MILLISECOND)
@Column(name = "date_of_birth")
private Date dateOfBirth;
}
Я также попробовал следующее в поле dateOfBirth
@Basic
@Field(bridge = @FieldBridge( impl = ElasticsearchDateBridge.class))
@Column(name = "date_of_birth")
@JsonFormat(pattern = "dd/MM/yyyy")
private Date dateOfBirth;
У нас есть следующий код для добавления в наш запрос, который предназначен для поиска всех людей в возрасте, переданном из пользовательского интерфейса
public void withAgeRange(Integer lowerAge, Integer upperAge){
if(lowerAge != null || upperAge != null){
LocalDateTime localDateTime = LocalDateTime.now();
LocalDateTime lowerLocalDateTime = localDateTime.withYear(localDateTime.getYear() - upperAge);
LocalDateTime upperLocalDateTime = localDateTime.withYear(localDateTime.getYear() - lowerAge);
Date lowerDate = Date.from(lowerLocalDateTime.atZone(ZoneId.systemDefault()).toInstant());
Date upperDate = Date.from(upperLocalDateTime.atZone(ZoneId.systemDefault()).toInstant());
bool.must(getQueryBuilder().range().onField("datesOfBirth.dateOfBirth").from(lowerDate).to(upperDate).createQuery());
}
}
Изучение запроса до его выполнения показывает
+dateOfBirths.dateOfBirth:[33590595604 TO 1106595795604]
Глядя на пример документа с Люком, есть человек с датой рождения с индексированным значением 320976000000, который находится между нижней и верхней границей диапазона.
Соответствующий раздел Персонального картирования из Кибаны
"datesOfBirth": {
"properties": {
"currentDateOfBirth": {
"type": "boolean"
},
"dateOfBirth": {
"type": "date",
"store": true
}
}
},
Как уже упоминалось ранее, все остальные наши запросы диапазона работают как ожидалось.
Мы ожидаем, что будет возвращен хотя бы один человек, но независимо от того, в каком диапазоне мы пытаемся, мы всегда получим 0 результатов.
Любые идеи будут с благодарностью.