2012-03-20 13 views
0

整数値の検索を実行しようとしています。 私はこのような@Fieldとのparam注釈を付けている:私は、ルークと範囲検索を実行hibernate検索でint値の検索を実装するにはどうすればよいですか?

@Field(name = "confirmedCount", index = UN_TOKENIZED, store = Store.YES) 
public int getConfirmedCount() { 
    return stuff.size(); 
} 

を:

confirmedCount:[5 TO 100] 

私は戻って取得結果は空です。 私は、試してみてください。

confirmedCount:[1 TO 2] 

結果は次のとおりです。

name confirmedCount 
b 1 
a 1 
d 19 
c 2 

だから私の質問です:私はこの応答を取得しないと私はそれをどのように解決するのはなぜ? 私は休止状態の検索3.0.1.GAを使用します

答えて

3

私は私の質問への答えはRTFMだと思います!ドキュメントには、明確に記載されています:

数値は文字列表現に変換されます。 数字は箱の 外(すなわち及んだクエリで使用)のLuceneで比較することはできないことに注意してください:彼らは

を埋めする必要があるので、私たちはクラスのブリッジを実装する必要があります。

public class PaddedIntegerBridge implements StringBridge { 

    private int PADDING = 5; 

    public String objectToString(Object object) { 
     String rawInteger = ((Integer) object).toString(); 
     if (rawInteger.length() > PADDING) 
      throw new IllegalArgumentException("Try to pad on a number too big"); 
     StringBuilder paddedInteger = new StringBuilder(); 
     for (int padIndex = rawInteger.length() ; padIndex < PADDING ; padIndex++) { 
      paddedInteger.append('0'); 
     } 
     return paddedInteger.append(rawInteger).toString(); 
    } 
} 

その後我々は、それがインデックスを取得するようにフィールドに注釈を付ける必要があります。

@Field(name = "confirmedCount", index = UN_TOKENIZED, store = Store.YES, bridge = @FieldBridge(impl = PaddedIntegerBridge.class)) 
    public int getConfirmedCount() { 
     return stuff.size(); 
    } 

はその後、私の検索で私は、クエリと出来上がりを作成するときに、この橋を利用するために必要それが動作=)

ルークといくつかのテスト:休止検索の

confirmedCount:[00005 TO 00100] 

name confirmedCount 
g 00006 
d 00019 
3

私は3.0.1 GAのドキュメントを見つけることができませんでしたが、新しいバージョンでは、NumericField annotationを持っています。

+0

として文字列フィールドに並べ替えの適用しますsearch/3.2/api/org/hibernate/search/annotations/http://docs.jboss.org/hibernate/search/3.3/api/org/hibernate/search/annotations/ =) – jakob

+0

アップグレードに興味があるかもしれませんNumericFieldは範囲クエリのパフォーマンスを向上させるため、http://lucene.apache.org/core/old_versioned_docs/versions/3_5_0/ap i/all/org/apache/lucene/search/NumericRangeQuery.html – jpountz

+0

あなたは正しいです。私はそれを最終的にやります。ありがとう! – jakob

0

文字列型のフィールドがありますが、数値型でソートして、それに対してrangクエリを適用するとします。文字列フィールドを数値フィールドに変換する必要がありますが、ここでフィールドを変換することなく、フィールド上でクエリを呼び出すことができ、数値のようなソートを適用できます。

フィールドにカスタム@FieldBridgeを追加または作成します。

@Field(index=Index.YES,analyze=Analyze.NO,store=Store.YES) @FieldBridge(impl=StringToNumberBridge.class)

private String currentCtc;

あなたは数としてcurrentCtcフィールドを検索したいが、それは文字列フィールドだと仮定します。 currentCtcフィールドにRang Queryを実装することができます。

public class StringToNumberBridge implements TwoWayStringBridge { 

    Logger logger=Logger.getLogger(StringToNumberBridge.class); 
    public static String PADDING_PROPERTY = "padding"; 
    private int padding = 7; //default 

    public String objectToString(Object object) { 

     try { 
      if(object!=null) 
      { 
       String rawInteger = ((String) object).toString(); 
       String decimalPoint=""; 

       if(rawInteger.matches("\\d*\\.\\d+")) 
       { 
        decimalPoint=rawInteger.substring(rawInteger.indexOf(".")); 
        rawInteger=rawInteger.substring(0,rawInteger.indexOf(".")); 
        System.out.println(decimalPoint); 
        System.out.println(rawInteger); 
       } 
       if (rawInteger.length() > padding) 
        throw new IllegalArgumentException("Try to pad on a number too big"); 

       StringBuilder paddedInteger = new StringBuilder(); 
       for (int padIndex = rawInteger.length(); padIndex < padding; padIndex++) 
       { 
        paddedInteger.append('0'); 
       } 
       return paddedInteger.append(rawInteger).append(decimalPoint).toString(); 
      } 
      else { 
       return ""; 
      } 
      //return object.toString(); 
     } 
     catch (Exception e) { 
      logger.error("NumberFormateException:::::::::::"+e); 
      return null; 
     } 
    } 

    public Object stringToObject(String stringValue) { 
     return Double.valueOf(stringValue); 
    } 
} 

同じような番号のパディングを持つインデックス文字列フィールドがあります。 Rang Query on Stringフィールドを適用しますが、数字のように機能します。

booleanQuery.must(qb.range().onField("currentCtc").below(25000).createQuery());

は数

私が使用しているだろうが、NumericFieldが3.3 http://docs.jboss.org/hibernate/まで導入されなかったものだ

SortField field = new SortField("currentCtc".trim(), SortField.DOUBLE,true);

関連する問題