簡體   English   中英

如何在休眠搜索中實現對int值的搜索?

[英]How do I implement search for int values in hibernate search?

我正在嘗試搜索整數值。 我已經用@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

好的,我想我的問題的答案是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();
    }

然后在我的搜索中,我只需要在創建查詢時使用此橋即可,就可以使用它=)

用Luke進行一些測試:

confirmedCount:[00005 TO 00100]

name confirmedCount
g    00006
d    00019

我找不到3.0.1 GA的文檔,但是較新版本的Hibernate Search具有NumericField批注

如果您具有字符串類型字段,但您希望按數字進行排序,然后對它進行范圍查詢。 您必須具有將字符串字段轉換為數字字段的功能,但是在此無需轉換字段的情況下,您可以對字段實施范圍查詢,並像數字一樣應用排序。

在字段上添加或創建自定義@FieldBridge。

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

private String currentCtc;

假設您要搜索currentCtc字段作為數字,但是它是字符串字段。 您可以在currentCtc字段上實現范圍查詢。

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

您有索引字符串字段,其填充與數字相同。 在字符串字段上應用范圍查詢,但其工作方式類似於數字。

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

將字符串字段上的排序應用為數字

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM