0

整数値の検索を実行しようとしています。私は次のように@Fieldでパラメータに注釈を付けました:

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

次に、lukeを使用して範囲検索を実行します。

confirmedCount:[5 TO 100]

私が返す結果は空です。次に試してみます:

confirmedCount:[1 TO 2]

結果は次のとおりです。

name confirmedCount
b    1
a    1
d    19
c    2

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

4

3 に答える 3

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
于 2012-03-20T15:06:18.157 に答える
3

3.0.1 GAのドキュメントが見つかりませんでしたが、HibernateSearchの新しいバージョンにはNumericFieldアノテーションがあります。

于 2012-03-20T15:15:38.540 に答える
0

文字列型のフィールドがあるが、数値で並べ替えて、それにrangクエリを適用したい場合。文字列フィールドを数値フィールドに変換する必要がありますが、ここではフィールドを変換せずに、フィールドにrangクエリを実装し、数値のように並べ替えを適用できます。

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

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

private String currentCtc;

currentCtcフィールドを数値として検索したいが、それは文字列フィールドであるとします。currentCtcフィールドにRangQueryを実装できます。

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

数字と同じようにパディングされたインデックス文字列フィールドがあります。文字列フィールドにRangQueryを適用しますが、数値のように機能します。

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

文字列フィールドに数値として並べ替えを適用する

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

于 2016-08-01T11:28:40.617 に答える