2012-10-23 37 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