Я использую Hibernate Search 5 в своем проекте. У меня есть глобальный механизм поиска и фильтра. Я применяю поиск на основе подстановочного знака, аналогичный «Like», а также разрешаю поиск по определенным полям. Однако при выполнении поиска в диапазоне по значениям даты я не получаю никаких результатов. Журналы подтверждают, что соответствующее значение было проиндексировано. Связанные кодовые блоки следующие. Так в чем же моя проблема в соответствии с кодами ниже? Что я не вижу?@Column(name = "created_at", updatable = false)
@Field(name = "createdAt", analyze = Analyze.NO)
@SortableField(forField = "createdAt")
@FieldBridge(impl = SearchableSortableOffsetDateTimeBridge.class)
@CreationTimestamp
protected OffsetDateTime createdAt;
< /code>
Полевой мост здесь: < /p>
public class SearchableSortableOffsetDateTimeBridge implements TwoWayFieldBridge {
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy");
@Override
public void set(String name, Object value, Document document, LuceneOptions luceneOptions) {
if (value != null) {
OffsetDateTime date = (OffsetDateTime) value;
long millis = date.toInstant().toEpochMilli();
String formattedDate = FORMATTER.format(date);
document.add(new NumericDocValuesField(name + "_long", millis));
document.add(new StoredField(name + "_long", millis));
document.add(new StringField(name, formattedDate, Field.Store.YES));
}
}
@Override
public Object get(String name, Document document) {
String dateString = document.get(name);
if (dateString != null) {
return FORMATTER.parse(dateString);
}
return null;
}
@Override
public String objectToString(Object object) {
if (object instanceof OffsetDateTime) {
return FORMATTER.format((OffsetDateTime) object);
}
return object.toString();
}
}
< /code>
и глобальный код поиска здесь: < /p>
QueryBuilder searchQueryBuilder = getQueryBuilder();
Query searchQuery = searchQueryBuilder.keyword()
.wildcard()
.onFields(fields)
.matching("*" + specialCharacters(searchTerm) + "*")
.createQuery();
// All query field
QueryBuilder queryBuilder = getQueryBuilder();
;
BooleanJunction boolJunction = queryBuilder.bool();
// filter query
if (request.getFilter() != null) {
if (request.getFilterList() == null) {
request.setFilterList(new ArrayList());
}
request.getFilterList().add(request.getFilter());
}
if (request.getFilterList() != null) {
for (ApiFilterRule apiFilterRule : request.getFilterList()) {
if (apiFilterRule.getValue() == null || ((String) apiFilterRule.getValue()).length() < 1)
continue;
Query filterQuery = null;
String filterTerm = null;
QueryBuilder filterQueryBuilder = getQueryBuilder();
if (apiFilterRule.getOperator().equals(OperatorType.EQUAL)
|| apiFilterRule.getOperator().equals(OperatorType.NOT_EQUAL)) {
filterTerm = specialCharacters(String.valueOf(apiFilterRule.getValue()));
filterQuery = filterQueryBuilder.keyword()
.wildcard()
.onFields(apiFilterRule.getField())
.matching(filterTerm)
.createQuery();
} else if ((apiFilterRule.getOperator().equals(OperatorType.BETWEEN)
|| apiFilterRule.getOperator().equals(OperatorType.NOT_BETWEEN))) {
String[] values = ((String) apiFilterRule.getValue()).split(",");
if (values.length == 2) {
try {
Long lowerBound = Long.valueOf(values[0].trim());
Long upperBound = Long.valueOf(values[1].trim());
filterQuery = queryBuilder.range()
.onField(apiFilterRule.getField() + "_long")
.from(lowerBound)
.to(upperBound)
.createQuery();
} catch (NumberFormatException e) {
throw new IllegalArgumentException("Invalid numeric range values: " + apiFilterRule.getValue(), e);
}
}
} else {
filterTerm = "*" + specialCharacters(String.valueOf(apiFilterRule.getValue())) + "*";
filterQuery = filterQueryBuilder.keyword()
.wildcard()
.onFields(apiFilterRule.getField())
.matching(filterTerm)
.createQuery();
}
if (filterQuery != null) {
if (apiFilterRule.getOperator().equals(OperatorType.NOT_EQUAL)
|| apiFilterRule.getOperator().equals(OperatorType.NOT_BETWEEN)) {
boolJunction.must(queryBuilder.all().except(filterQuery).createQuery());
} else {
boolJunction.must(filterQuery);
}
}
}
}
// join filter and search
boolJunction.must(searchQuery);
Query query = boolJunction.createQuery();
Подробнее здесь: https://stackoverflow.com/questions/794 ... ween-range