2012-10-23 58 views
2

我配置了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運行查詢之前自動運行?

+0

您是否通過會話或僅通過EntityManager嘗試了直接全文查詢? –

+0

我沒有,但我只是測試,並將結果添加到我的示例中。無論是Session還是EntityManager,我仍然可以通過本地Hibernate-Search獲得正確的結果。我擴展了我的示例以顯示我是否使用QueryDSL,如果我搜索分析器應用後如何將其存儲在Lucene中,我可以使其工作。 – redZebra2012

+0

好的,所以我想我想通了,或者至少有一種方法來獲得我正在尋找的查詢。看起來你是爲Mysema工作的,所以在回答我自己的問題之前,我會先運行它。使用QueryDSL爲Hibernate-Search創建的查詢似乎是在傳遞給Hibernate-Search時以明確的相等性創建的。然而,QueryDSL的Hibernate-Search模塊還提供了一個新的謂詞LuceneUtils.fuzzyLike(propertyPath,value),它給了我正在尋找的結果。我懷疑在查詢Lucene時我需要使用它而不是object.propertyPath.like(value)。 – redZebra2012

回答

0

關於你的問題,當使用查詢DSL時,默認情況下應用分析器。在大多數情況下,使用相同的分析器進行索引和搜索是有意義的。出於這個原因,除非使用'ignoreAnalyzer',否則分析儀將按默認值應用。

爲什麼你的第二個例子不起作用我不能告訴你。 SearchQuery不是Hibernate Search或ORM API的一部分。它必須是您的應用程序的內部類。這堂課發生了什麼?它使用哪種類型的查詢?

+0

這些問題似乎與Querydsl框架有關,而不是關於Hibernate Search的Query DSL。 Querydsl框架爲Hibernate Search提供支持,SearchQuery是其中的一部分。 –

+0

好吧,我明白了。仍然需要了解底下發生了什麼。另外第二個例子似乎缺少了一些東西。實際的搜索標準在哪裏? – Hardy

+0

感謝您對哈代的迴應。 Timo是正確的,我談論的是使用QueryDSL來查詢Hibernate-Search,而不是本地Hibernate-Search。當我使用本機Hibernate-Search時,它工作得很好。 – redZebra2012