QueryDSL&使用Lucene分析器进行Hibernate-Search

时间:2012-10-23 17:57:32

标签: java lucene hibernate-search querydsl

我将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 {}

我索引了一个标题为“快速棕色狐狸跳过懒狗”的实体。

这些工作......

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运行查询之前是否有自动运行它们?

1 个答案:

答案 0 :(得分:0)

关于您的问题,使用查询DSL时,默认情况下会应用分析器。在大多数情况下,使用相同的分析器进行索引和搜索是有意义的。因此,除非使用“ignoreAnalyzer”,否则将按默认应用分析器。

为什么你的第二个例子不起作用我不能告诉你。 SearchQuery 不是Hibernate Search或ORM API的一部分。它必须是您的应用程序的内部类。这堂课发生了什么?它使用哪种类型的查询?