我配置了Hibernate-Search以在我的實體編制索引時使用我的自定義分析器。但是,當我嘗試使用QueryDSL的Hibernate-Search集成進行搜索時,它沒有找到實體,但是如果我使用直接的hibernate-search,它會找到一些東西。使用Lucene分析器的QueryDSL和休眠搜索
@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 {}
我索引了一個標題爲「快速棕色狐狸跳過懶狗」的實體。
這些工作......
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
這不......
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的可能的結果),那麼它的工作原理搜索...
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運行查詢之前自動運行?
您是否通過會話或僅通過EntityManager嘗試了直接全文查詢? –
我沒有,但我只是測試,並將結果添加到我的示例中。無論是Session還是EntityManager,我仍然可以通過本地Hibernate-Search獲得正確的結果。我擴展了我的示例以顯示我是否使用QueryDSL,如果我搜索分析器應用後如何將其存儲在Lucene中,我可以使其工作。 – redZebra2012
好的,所以我想我想通了,或者至少有一種方法來獲得我正在尋找的查詢。看起來你是爲Mysema工作的,所以在回答我自己的問題之前,我會先運行它。使用QueryDSL爲Hibernate-Search創建的查詢似乎是在傳遞給Hibernate-Search時以明確的相等性創建的。然而,QueryDSL的Hibernate-Search模塊還提供了一個新的謂詞LuceneUtils.fuzzyLike(propertyPath,value),它給了我正在尋找的結果。我懷疑在查詢Lucene時我需要使用它而不是object.propertyPath.like(value)。 – redZebra2012