使用 Hibernate Search 进行搜索
Search with Hibernate Search
我设计了一个对话框,用户可以在其中搜索数据库。
用户输入你想要的文字然后你想在一个或所有表格中搜索。
这些表有字符串、双精度、布尔值、日期和您自己的对象作为字段。
搜索适用于字符串和数字字段,但在日期字段中我遇到了问题。
搜索示例:我想搜索“2015”。
我有两个查询示例:
示例 1:
org.apache.lucene.search.Query luceneQuery = qb
.keyword().wildcard()
.onFields( fields )
.matching( "2015" )
.createQuery();
这个查询我得到一个空结果。
示例 2:
org.apache.lucene.search.Query luceneQuery = qb
.keyword()
.onFields( fields )
.matching( "2015" )
.createQuery();
在这里我总是找回所有有日期的实体。
对于日期字段,我编写了自定义 FieldBridge。
import java.util.Calendar;
import java.util.Date;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.hibernate.search.bridge.LuceneOptions;
import org.hibernate.search.bridge.TwoWayFieldBridge;
public class DateStringFieldBridge implements TwoWayFieldBridge
{
private Calendar dateValue;
private String dateString;
@Override
public void set( final String name, final Object value, final Document document, final LuceneOptions luceneOptions )
{
if ( value != null )
{
final Calendar cal = Calendar.getInstance();
cal.setTime( (Date) value );
dateValue = cal;
final String day =
cal.get( Calendar.DAY_OF_MONTH ) < 10 ? 0 + "" + cal.get( Calendar.DAY_OF_MONTH ) : "" + cal.get( Calendar.DAY_OF_MONTH );
final int monthValue = cal.get( Calendar.MONTH ) + 1;
final String month = monthValue < 10 ? 0 + "" + monthValue : "" + monthValue;
final String year = "" + cal.get( Calendar.YEAR );
final String hour =
cal.get( Calendar.HOUR_OF_DAY ) < 10 ? 0 + "" + cal.get( Calendar.HOUR_OF_DAY ) : "" + cal.get( Calendar.HOUR_OF_DAY );
final String minute = cal.get( Calendar.MINUTE ) < 10 ? 0 + "" + cal.get( Calendar.MINUTE ) : "" + cal.get( Calendar.MINUTE );
dateString = day + "." + month + "." + year + " " + hour + ":" + minute;
if ( dateValue != null && luceneOptions != null && document != null )
addStringField( name, dateString, document, luceneOptions );
}
}
private void addStringField( final String fieldName, final String fieldValue, final Document document, final LuceneOptions luceneOptions )
{
final Field field =
new Field( fieldName, fieldValue, luceneOptions.getStore(), luceneOptions.getIndex(), luceneOptions.getTermVector() );
field.setBoost( luceneOptions.getBoost() );
document.add( field );
}
@Override
public Object get( final String arg0, final Document arg1 )
{
return dateValue.getTime();
}
@Override
public String objectToString( final Object arg0 )
{
return dateValue == null ? "" : dateString;
}
}
如何获得正确的结果?
我发现了错误。
我的 FieldBridge 中的方法 objectToString( final Object arg0 ) 是错误的。
传递的变量是搜索值。我以为是字段的值。
字符串 搜索值的解决方案:
@Override
public String objectToString( final Object searchValue )
{
return searchValue.toString();
}
我设计了一个对话框,用户可以在其中搜索数据库。 用户输入你想要的文字然后你想在一个或所有表格中搜索。
这些表有字符串、双精度、布尔值、日期和您自己的对象作为字段。 搜索适用于字符串和数字字段,但在日期字段中我遇到了问题。
搜索示例:我想搜索“2015”。
我有两个查询示例:
示例 1:
org.apache.lucene.search.Query luceneQuery = qb
.keyword().wildcard()
.onFields( fields )
.matching( "2015" )
.createQuery();
这个查询我得到一个空结果。
示例 2:
org.apache.lucene.search.Query luceneQuery = qb
.keyword()
.onFields( fields )
.matching( "2015" )
.createQuery();
在这里我总是找回所有有日期的实体。
对于日期字段,我编写了自定义 FieldBridge。
import java.util.Calendar;
import java.util.Date;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.hibernate.search.bridge.LuceneOptions;
import org.hibernate.search.bridge.TwoWayFieldBridge;
public class DateStringFieldBridge implements TwoWayFieldBridge
{
private Calendar dateValue;
private String dateString;
@Override
public void set( final String name, final Object value, final Document document, final LuceneOptions luceneOptions )
{
if ( value != null )
{
final Calendar cal = Calendar.getInstance();
cal.setTime( (Date) value );
dateValue = cal;
final String day =
cal.get( Calendar.DAY_OF_MONTH ) < 10 ? 0 + "" + cal.get( Calendar.DAY_OF_MONTH ) : "" + cal.get( Calendar.DAY_OF_MONTH );
final int monthValue = cal.get( Calendar.MONTH ) + 1;
final String month = monthValue < 10 ? 0 + "" + monthValue : "" + monthValue;
final String year = "" + cal.get( Calendar.YEAR );
final String hour =
cal.get( Calendar.HOUR_OF_DAY ) < 10 ? 0 + "" + cal.get( Calendar.HOUR_OF_DAY ) : "" + cal.get( Calendar.HOUR_OF_DAY );
final String minute = cal.get( Calendar.MINUTE ) < 10 ? 0 + "" + cal.get( Calendar.MINUTE ) : "" + cal.get( Calendar.MINUTE );
dateString = day + "." + month + "." + year + " " + hour + ":" + minute;
if ( dateValue != null && luceneOptions != null && document != null )
addStringField( name, dateString, document, luceneOptions );
}
}
private void addStringField( final String fieldName, final String fieldValue, final Document document, final LuceneOptions luceneOptions )
{
final Field field =
new Field( fieldName, fieldValue, luceneOptions.getStore(), luceneOptions.getIndex(), luceneOptions.getTermVector() );
field.setBoost( luceneOptions.getBoost() );
document.add( field );
}
@Override
public Object get( final String arg0, final Document arg1 )
{
return dateValue.getTime();
}
@Override
public String objectToString( final Object arg0 )
{
return dateValue == null ? "" : dateString;
}
}
如何获得正确的结果?
我发现了错误。 我的 FieldBridge 中的方法 objectToString( final Object arg0 ) 是错误的。
传递的变量是搜索值。我以为是字段的值。
字符串 搜索值的解决方案:
@Override
public String objectToString( final Object searchValue )
{
return searchValue.toString();
}