Java 如何在hibernate搜索中实现int值搜索?

Java 如何在hibernate搜索中实现int值搜索?,java,lucene,hibernate-search,luke,Java,Lucene,Hibernate Search,Luke,我正在尝试搜索整数值。 我用@Field注释了param,如下所示: @Field(name = "confirmedCount", index = UN_TOKENIZED, store = Store.YES) public int getConfirmedCount() { return stuff.size(); } 然后,我与luke一起执行范围搜索: confirmedCount:[5 TO 100] 我得到的结果是空的。 然后我尝试: confirmedCount:[1

我正在尝试搜索整数值。 我用@Field注释了param,如下所示:

@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
所以我的问题是:为什么我会得到这种反应,我该如何解决它?
我使用HibernateSearch 3.0.1.GA

好的,我想我的问题的答案是RTFM!文件明确指出:

数字将转换为其字符串表示形式。注意 Lucene无法比较数字(即用于范围查询)out 盒子的底部:它们必须被填充

因此,我们需要实现一个类桥:

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();
    }
}
然后在我的搜索中,我只需要在创建查询时使用这个桥,瞧 它有效=)

与Luke的一些测试:

confirmedCount:[00005 TO 00100]

name confirmedCount
g    00006
d    00019

好的,我想我的问题的答案是RTFM!文件明确指出:

数字将转换为其字符串表示形式。注意 Lucene无法比较数字(即用于范围查询)out 盒子的底部:它们必须被填充

因此,我们需要实现一个类桥:

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();
    }
}
然后在我的搜索中,我只需要在创建查询时使用这个桥,瞧 它有效=)

与Luke的一些测试:

confirmedCount:[00005 TO 00100]

name confirmedCount
g    00006
d    00019

我找不到3.0.1 GA的文档,但更新版本的Hibernate Search有一个。

我找不到3.0.1 GA的文档,但更新版本的Hibernate Search有一个。

如果您有字符串类型字段,但希望按数字排序并对其应用范围查询。您必须将字符串字段转换为数字字段,但在这里不转换字段,您可以在字段上实现范围查询并应用排序,如数字

在字段上添加或创建自定义@FieldBridge

@字段(index=index.YES,analyze=analyze.NO,store=store.YES)
@FieldBridge(impl=StringToNumberBridge.class)

私有字符串

假设您想将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);
    }
}
公共类StringToNumberBridge实现双向StringBridge{
Logger=Logger.getLogger(StringToNumberBridge.class);
公共静态字符串填充\u PROPERTY=“PADDING”;
private int padding=7;//默认值
公共字符串objectToString(对象对象){
试一试{
if(对象!=null)
{
字符串rawInteger=((字符串)对象).toString();
字符串小数点=”;
if(rawInteger.matches(“\\d*\\.\\d+”)
{
decimalPoint=rawInteger.substring(rawInteger.indexOf(“.”);
rawInteger=rawInteger.substring(0,rawInteger.indexOf(“.”);
系统输出打印LN(小数点);
System.out.println(rawInteger);
}
if(rawInteger.length()>填充)
抛出新的IllegalArgumentException(“尝试填充过大的数字”);
StringBuilder paddedInteger=新StringBuilder();
对于(int padIndex=rawInteger.length();padIndex
您的索引字符串字段填充了相同的数字。 对字符串字段应用范围查询,但其工作方式类似于数字

booleanQuery.must(qb.range().onField(“currentCtc”)。低于(25000.createQuery())

对字符串字段应用排序作为编号


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

如果您有字符串类型字段,但希望按数字排序并对其应用范围查询。您必须将字符串字段转换为数字字段,但在这里不转换字段,您可以在字段上实现范围查询并应用排序,如数字

在字段上添加或创建自定义@FieldBridge

@字段(index=index.YES,analyze=analyze.NO,store=store.YES)
@FieldBridge(impl=StringToNumberBridge.class)

私有字符串

假设您想将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);
    }
}
公共类StringToNumberBridge实现双向StringBridge{
Logger=Logger.getLogger(StringToNumberBridge.class);
公共静态字符串填充\u PROPERTY=“PADDING”;
private int padding=7;//默认值
公共字符串objectToString(对象对象){
试一试{
if(对象!=null)
{
字符串rawInteger=((字符串)对象).toString();
字符串小数点=”;
if(rawInteger.matches(“\\d*\\.\\d+”)
{
decimalPoint=rawInteger.substring(rawInteger.indexOf(“.”);
rawInteger=rawInteger.substring(0,rawInteger.indexOf(“.”);
系统输出打印LN(小数点);
System.out.println(rawInteger);
}
if(rawInteger.length()>填充)
抛出新的IllegalArgumentException(“尝试填充过大的数字”);
StringBuilder paddedInteger=新StringBuilder();
对于(int padIndex=rawInteger.length();padIndex