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);

最後に、結果を一覧表示する前に、ファセットの 1 つを介して結果を制限します。

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

可能なすべての rangeFacets を試しましたが、結果を返すものはありません。range() ファセットの他に、同じように動作するさまざまなテキスト ファセットがありますが、結果は通常どおりフィルター処理されます。また、facetManager は facetRange の結果を返しますが、それでも試してみると、fullTextQuery.list() を呼び出したときに結果が 0 になります。

私は何が欠けていますか?

ありがとう !

4

1 に答える 1

1

結局、doubleを文字列に変換する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 に答える