エンティティのインデックス作成時にカスタム アナライザーを使用するように 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 {}
「怠惰な犬を飛び越えた素早い茶色のキツネ」というタイトルのエンティティを索引付けしました。
これらは機能します...</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 がクエリを実行する前にそれらを自動的に実行する方法はありますか?