无法在Hibernate Search中按自定义字段进行搜索

时间:2017-09-06 15:44:42

标签: java hibernate lucene hibernate-search

我使用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

哪里有错误?求救!

0 个答案:

没有答案