我将 Hibernate-Search 配置为在索引我的实体时使用我的自定义分析器。但是,当我尝试使用 QueryDSL 的 Hibernate-Search 集成进行搜索时,它不会找到实体,但如果我使用直接的 hibernate-search 它会找到一些东西。
@AnalyzerDef(name = "customanalyzer",
tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
filters = {
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(factory = SnowballPorterFilterFactory.class, params = {
@Parameter(name = "language", value = "English")
})
})
@Analyzer(definition = "customanalyzer")
public abstract class Post extends BaseEntity {}
我索引了一个标题为“the quick brown fox jumped over the lazy dog”的实体。
这些工作……</p>
List articlePosts = fullTextEntityManager.createFullTextQuery(queryBuilder.keyword().onFields("title").matching("jumped").createQuery(), ArticlePost.class).getResultList(); // list of 2
List articlePosts = fullTextSession.createFullTextQuery(queryBuilder.keyword().onFields("title").matching("jumped").createQuery(), ArticlePost.class).getResultList(); // list of 2
这不……</p>
SearchQuery<ArticlePost> query = new SearchQuery<ArticlePost>(this.entityManagerFactory.createEntityManager().unwrap(HibernateEntityManager.class).getSession(), post);
List articlePosts = query.where(post.title.contains("jumped")).list() // empty list
但是搜索一下它是如何存储在 Lucene 中的(SnowballPorter 的可能结果),然后它就可以工作了……</p>
SearchQuery<ArticlePost> query = new SearchQuery<ArticlePost>(this.entityManagerFactory.createEntityManager().unwrap(HibernateEntityManager.class).getSession(), post);
List articlePosts = query.where(post.title.contains("jump")).list() // list of 2
因此,似乎在使用 QueryDSL 时,分析器在执行查询之前并未运行。谁能确认这是问题所在,无论如何在 QueryDSL 运行查询之前让它们自动运行?