Hibernate搜索只返回精确值

Hibernate搜索只返回精确值,hibernate,full-text-search,hibernate-search,Hibernate,Full Text Search,Hibernate Search,我的程序只返回与搜索字符串完全相等的值: trans = session.beginTransaction(); FullTextSession fullTextSession = Search.getFullTextSession(session); fullTextSession.createIndexer().startAndWait(); QueryBuilder qB = fullTextSession.getSearchFactory().buildQueryBuilder() .f

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

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();

例如:当搜索字符串为“用户”时,我将获得列表,但当搜索字符串为“用户”或“使用”时,我将获得空值。

我不知道如何为字段编制索引,似乎您没有使用适当的分析器。阅读相关文档

尝试使用使用hibernate搜索注释和Solr分析器、标记器和过滤器的自定义分析器

这有助于您开始:

@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
  ...
}
@实体
@索引
@AnalyzerDef(name=“customanalyzer”,
tokenizer=@TokenizerDef(工厂=StandardTokenizerFactory.class),
过滤器={
@TokenFilterDef(工厂=LowerCaseFilterFactory.class),
@TokenFilterDef(工厂=SnowballPorterFilterFactory.class,参数={
@参数(name=“language”,value=“English”)
})
})
公共课堂用书{
@身份证
@生成值
@文档ID
私有整数id;
@场
@Analyzer(definition=“customanalyzer”)
私有字符串标题;
@场
@Analyzer(definition=“customanalyzer”)
私有字符串字幕;
@指数化
@许多
“专用集”

  • 或者像这样使用:

    Query luceneQuery=qb.keyword().wildcard().onField(“lastName”).matching(“use*”).createQuery()


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

    这也是一篇很棒的文章,例如: