我正在尝试将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结果。
我缺少什么?
谢谢!
答案 0 :(得分: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值;)