2012-06-26 3 views
1

Я пытаюсь принять Hibernate Search в свое приложение, но я застрял в ограничении результатов поиска с помощью граничного диапазона, чтобы ограничить результаты на основе ценовых диапазонов.Hibernate Search: facet on double does not return results

Мой код (сниппеты):

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, но никто не возвращает никаких результатов. Помимо грани диапазона(), у меня есть разные текстовые грани, которые работают одинаково, но обычно фильтруют результаты. Кроме того, facetManager resports результаты для результатов facetRange, но при попытке все же он приводит к 0 результатам при вызове fullTextQuery.list().

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

Спасибо!

ответ

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; 

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