![](/img/trans.png)
[英]How to implement a search filter with Spring + Hibernate + MySQL?
[英]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.