QueryDSL & Hibernate-Search with Lucene Analyzers



我在索引我的实体时配置了Hibernate-Search以使用我的自定义分析器。但是,当我尝试使用QueryDSL的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(可能是雪球运动员的结果)中,然后起作用……

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运行查询之前自动运行?

关于您的问题,使用查询DSL时,分析仪将在每个默认值中应用。在大多数情况下,使用相同的分析仪进行索引和搜索是有意义的。因此,除非使用"无知分析仪",否则将应用分析仪。

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

最新更新