使用Hibernate搜索进行搜索

时间:2015-07-07 10:00:28

标签: java hibernate lucene full-text-search hibernate-search

我设计了一个用户可以在数据库中搜索的对话框。 用户输入您想要的文本,然后您想在一个或所有表格中搜索。

表格包含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;
  }

}

如何获得正确的结果?

1 个答案:

答案 0 :(得分:1)

我发现了错误。 我的FieldBridge中的方法 objectToString(final Object arg0)是错误的。

传递的变量是搜索值。我认为这是该领域的价值。

字符串 searchValue:

的解决方案
  @Override
  public String objectToString( final Object searchValue )
  {
    return searchValue.toString();
  }