Spring Boot 有没有可能用Hibernate Search 6完全取代Lucenes MultiFieldQueryParser

lf5gs5x2  于 2023-04-20  发布在  Spring
关注(0)|答案(1)|浏览(113)

我即将从Hibernate 5迁移到Hibernate search 6,并正在寻找一些建议。据我所知,版本6的主要意图是将API与底层实现更多地解耦。我在代码中有这样的内容:

FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
SearchFactory searchFactory = fullTextEntityManager.getSearchFactory();
QueryBuilder queryBuilder = searchFactory.buildQueryBuilder().forEntity(Service.class).get();
BooleanJunction<?> bool = queryBuilder.bool();
Analyzer analyzer = searchFactory.getAnalyzer("standard");

if (StringUtils.isNotBlank(searchString)) {
    MultiFieldQueryParser multiFieldQueryParser = new MultiFieldQueryParser(new String[] {
            "name", "description", "company.name", "configuration.name",
    }, analyzer);
    multiFieldQueryParser.setDefaultOperator(QueryParserBase.AND_OPERATOR);
    org.apache.lucene.search.Query querySearchString = multiFieldQueryParser.parse(searchString);
    bool.must(querySearchString);
}

Query fullTextQuery = fullTextEntityManager.createFullTextQuery(bool.createQuery(), Service.class);
return fullTextQuery.getResultList();

MultiFieldQueryParser、QueryParserBase和Query都是lucene后端的类,有没有可能用纯hibernate搜索查询语法(Query DSL)实现同样的查询?
我找到了一些简单的字段示例,但是我可以使用类似“www.example.com”的内容company.name来注解@IndexedEmbedded的相关实体字段吗?
感谢和最好的问候马特
谢谢

h7appiyu

h7appiyu1#

是的,这应该是可能的。接下来的一些事情:

searchSession.search( Service.class )
    .where( f -> f.and(
            f.match().field( "name" ).matching( searchString ),
            f.match().field( "description" ).matching( searchString )
            f.match().field( "company.name" ).matching( searchString )
    ) )
    .fetchHits( .. )

在这里查看嵌套结构的文档-https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#mapper-orm-indexedembedded-structure。这里有您正在寻找的示例。此外,建议您查看迁移指南-https://docs.jboss.org/hibernate/search/6.0/migration/html_single/。它包含了许多关于从5迁移到6的有用信息

相关问题