Hibernate Search: грань на двойном не возвращает результатов

Я пытаюсь внедрить Hibernate Search в свое приложение, но я застрял в ограничении результатов поиска по аспекту диапазона, чтобы ограничить результаты на основе ценовых диапазонов.

Мой код (фрагменты):

Product.java содержит:

    @Field(analyze = Analyze.NO, store = Store.YES, bridge = @FieldBridge(impl = DoubleBridge.class))
@NumericField()
private double price = 0.0;

Мой обработчик поиска, построение ценового аспекта:

        FacetingRequest priceFacetingRequest = builder.facet()
            .name( "price" )
            .onField("price")
            .range()
            .below(10.0)
            .from(11.0).to(24.0)
            .from(25.0).to(49.0)
            .from(50.0).to(99.0)
            .from(100.0).to(199.0)
            .from(200.0).to(499.0)
            .from(500.0).to(999.0)
            .from( 1000.0 ).to( 1499.0 )
            .above( 1500.0 )
            .excludeLimit()
            .createFacetingRequest();

    facetManager.enableFaceting(priceFacetingRequest);

И, наконец, перед перечислением результатов, ограничение результатов по одному из аспектов:

facetManager.getFacetGroup( "price" ).selectFacets( rangeFacet );

Я пробовал все возможные rangeFacets, но ни один из них не дал никаких результатов. Помимо аспекта range(), у меня есть разные текстовые аспекты, которые работают одинаково, но обычно фильтруют результаты. Кроме того, facetManager сообщает о результатах для результатов facetRange, но попытка по-прежнему приводит к 0 результатам при вызове fullTextQuery.list().

Что мне не хватает?

Спасибо !


person Marius    schedule 26.06.2012    source источник


Ответы (1)


В итоге я написал FieldBridge, который транскрибирует двойное число в строку;

public class CoreDoubleBridge implements FieldBridge
{

@Override
public void set(String s, Object o, Document document, LuceneOptions luceneOptions)
{
    if (o instanceof Double)
    {
        NumericField field = new NumericField(s, Field.Store.YES, true);
        field.setDoubleValue((Double)o);
        document.add(field);

        Field fieldForFacet = new Field(s + ".facet", Double.toString((Double)o), Field.Store.YES, Field.Index.NOT_ANALYZED);
        document.add(fieldForFacet);
    }
}

}

И аннотировал свойство цены следующим образом:

@Field(analyze = Analyze.NO, store = Store.YES)
@FieldBridge(impl = CoreDoubleBridge.class)
private Double price = 0.0;

Я надеюсь, что это поможет некоторым другим бедным ублюдкам, ищущим решение для правильной огранки значений Double;)

person Marius    schedule 28.06.2012