Java 如何在hibernate搜索中实现int值搜索?
我正在尝试搜索整数值。 我用@Field注释了param,如下所示: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(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