我设计了一个用户可以在数据库中搜索的对话框。 用户输入您想要的文本,然后您想在一个或所有表格中搜索。
表格包含String,Double,Boolean,Date和您自己的对象作为字段。 搜索适用于字符串和数字字段,但在日期字段中我遇到了问题。
搜索示例:我想搜索" 2015"。
我有两个Querys的例子:
示例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;
}
}
如何获得正确的结果?
答案 0 :(得分:1)
我发现了错误。 我的FieldBridge中的方法 objectToString(final Object arg0)是错误的。
传递的变量是搜索值。我认为这是该领域的价值。
字符串 searchValue:
的解决方案 @Override
public String objectToString( final Object searchValue )
{
return searchValue.toString();
}