Hibernate搜索仅返回精确值

时间:2015-08-23 14:48:42

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

我的程序只返回与搜索字符串完全相同的值:

trans = session.beginTransaction();
FullTextSession fullTextSession = Search.getFullTextSession(session);
fullTextSession.createIndexer().startAndWait();
QueryBuilder qB = fullTextSession.getSearchFactory().buildQueryBuilder()
.forEntity(Customer.class).get();

org.apache.lucene.search.Query luceneQuery = qB.keyword()
.onFields("lastName").matching(searchString).createQuery();

Query fullTextQuery = fullTextSession.createFullTextQuery(luceneQuery);
list = fullTextQuery.list();

例如:当搜索字符串为'user'时,我将获得列表,但当搜索字符串为'User'或'Use'时,我将为null。

1 个答案:

答案 0 :(得分:2)

我不知道你如何索引你的字段,似乎你没有使用合适的分析器。阅读有关它的文档。

尝试使用hibernate搜索注释和Solr Analyzers,Tokenizers和Filters来使用自定义分析器。

这是example可以帮助您开始:

@Entity
@Indexed
@AnalyzerDef(name = "customanalyzer",
  tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
  filters = {
    @TokenFilterDef(factory = LowerCaseFilterFactory.class),
    @TokenFilterDef(factory = SnowballPorterFilterFactory.class, params = {
      @Parameter(name = "language", value = "English")
    })
  })
public class Book {

  @Id
  @GeneratedValue
  @DocumentId
  private Integer id;

  @Field
  @Analyzer(definition = "customanalyzer")
  private String title;

  @Field
  @Analyzer(definition = "customanalyzer")
  private String subtitle;

  @IndexedEmbedded
  @ManyToMany
  private Set<Author> authors = new HashSet<Author>();

  @Field(index = Index.YES, analyze = Analyze.NO, store = Store.YES)
  @DateBridge(resolution = Resolution.DAY)
  private Date publicationDate;

  public Book() {
  }

  // standard getters/setters follow here
  ...
}

使用此示例的分析器,您将能够找到用户&#39;和&#39;用户&#39; ......

能够找到用户&#39;当您的关键字是&#39;使用&#39;你好吗:

  1. 使用其他分析工具,例如&#39; EdgeNGramFilterFactory&#39;。

  2. 或像这样使用wildcard queries

    查询luceneQuery = qb.keyword()。wildcard()。onField(&#34; lastName&#34;)。匹配(&#34;使用*&#34;)。createQuery();

  3. 文档很简单,学习Hibernate Search的最佳方法就是阅读它。