我使用Hibernate Search 5.5.7(当前稳定版),我需要通过OffsetDateTime部分(小时和分钟)搜索,但没有日期。 我看到了such solution。 我的桥:
public class OrderDeliveryTimeBridge implements
MetadataProvidingFieldBridge, ParameterizedBridge {
public static final String INTERVAL_BOUND_PROPERTY_NAME = "intervalBound";
public static final String INTERVAL_BOUND_START = "start";
public static final String INTERVAL_BOUND_END = "end";
public static final String BCD_TIME_SUFFIX = "_BCDTime";
public static final String PROPERTY_NAME_START = INTERVAL_BOUND_START + BCD_TIME_SUFFIX;
public static final String PROPERTY_NAME_END = INTERVAL_BOUND_END + BCD_TIME_SUFFIX;
private String intervalBound;
private static final Logger log = LoggerFactory.getLogger(OrderDeliveryTimeBridge.class);
@Override
public void configureFieldMetadata(String name, FieldMetadataBuilder builder) {
builder.field(getPropertyName(), FieldType.INTEGER);
builder.field(name, FieldType.STRING);
}
@Override
public void set(String name, Object value, Document document, LuceneOptions luceneOptions) {
log.info("Set called for {}", name);
OffsetDateTime dateTime = (OffsetDateTime) value;
Integer fieldValue = dateTime.getHour() * 100 + dateTime.getMinute();
log.info("Add field '{}' with value '{}'", getPropertyName(), fieldValue);
luceneOptions.addNumericFieldToDocument(getPropertyName(), fieldValue, document);
IntField field = new IntField(getPropertyName(), fieldValue, Field.Store.NO);
document.add(field);
}
private String getPropertyName() {
if (intervalBound.equals(INTERVAL_BOUND_START))
return PROPERTY_NAME_START;
else return PROPERTY_NAME_END;
}
@Override
public void setParameterValues(Map<String, String> parameters) {
String bound = parameters.get(INTERVAL_BOUND_PROPERTY_NAME);
if (StringUtils.isBlank(bound))
throw new IllegalArgumentException("The parameter 'INTERVAL_BOUND_PROPERTY_NAME' are required!");
if (!bound.equals(INTERVAL_BOUND_START) && !bound.equals(INTERVAL_BOUND_END))
throw new IllegalArgumentException("Unknown value for parameter 'INTERVAL_BOUND_PROPERTY_NAME'");
intervalBound = bound;
}
}
财产的映射:
@Field(store = Store.YES, bridge =
@FieldBridge(impl = OrderDeliveryTimeBridge.class,
params = @Parameter(name = OrderDeliveryTimeBridge.INTERVAL_BOUND_PROPERTY_NAME,
value = OrderDeliveryTimeBridge.INTERVAL_BOUND_START)
))
private OffsetDateTime desiredDeliveryIntervalStart;
尝试搜索:
queryBuilder.keyword().onField(OrderDeliveryTimeBridge.PROPERTY_NAME_START).matching(820).createQuery()
但是我有一个例外:org.hibernate.search.exception.SearchException:无法在
中找到字段start_BCDTime哪里有错误?求救!