使用 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();
  }