1

我正在尝试在我的应用程序中采用 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 结果的结果,但在调用 fullTextQuery.list() 时仍然尝试它会导致 0 结果。

我错过了什么?

谢谢 !

4

1 回答 1

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 值的解决方案;)

于 2012-06-28T07:25:56.650 回答