Hibernate Search 是一个库,它通过自动索引实体,将 Hibernate ORM 与 Apache Lucene 或 Elasticsearch 集成,从而实现高级搜索功能:全文搜索、地理空间搜索、聚合等。更多详细信息,请参阅 hibernate.org 上的 Hibernate Search。

我们刚刚发布了 Hibernate Search 7.2.0.Alpha1,这是 Hibernate Search 下一个次要版本的第一个 alpha 版本。

此版本包含许多对搜索 DSL 的改进,包括新的投影类型、谓词改进、查询参数等。

它还升级了 Lucene 和 Hibernate ORM 依赖项,并包括与最新 OpenSearch 2.14 的兼容性。

新增功能

Hibernate Search 7.2 仍在开发初期:一些功能可能还不完整,或者可能以不向后兼容的方式更改。

依赖项升级

Hibernate ORM (HSEARCH-5150)

Hibernate Search 现在依赖于 Hibernate ORM 6.5.1.Final。

Lucene (HSEARCH-5086)

Lucene 后端现在使用 Lucene 9.10.0。

OpenSearch (HSEARCH-5151)

Elasticsearch 后端与 OpenSearch 2.14 一起工作,以及其他已经兼容的版本。

其他

queryString/simpleQueryString 谓词用于数值/日期字段

simpleQueryStringqueryString 现在可以应用于数值和日期字段。

List<Book> hits = searchSession.search( Book.class )
        .where( f -> f.queryString()
                .field( "numberOfPages" )
                .matching( "[350 TO 800]" )
        )
        .fetchHits( 20 );

有关详细信息,请参阅 simpleQueryString queryString 文档中的相应部分。

match 断言和应匹配的最小词数

随着 minimumShouldMatch 选项的引入,类似于已可用于 boolqueryStringsimpleQueryString 断言的选项,现在可以要求匹配字符串中的任意数量的词出现在文档中,以便 match 断言匹配。

List<Book> hits = searchSession.search( Book.class )
        .where( f -> f.match()
                .field( "title" )
                .matching( "investigation detective automatic" )
                .minimumShouldMatchNumber( 2 ) ) (1)
        .fetchHits( 20 ); (2)
1 至少有两个词必须匹配才能使此断言匹配。
2 所有返回的命中项至少匹配两个词:它们的标题将匹配 investigationdetectiveinvestigationautomaticdetectiveautomatic,或所有这三个词。

在查询级别的基本参数支持

Search DSL 中引入了一些 withParameters(..) 方法。通过它们,现在可以使用查询参数构建 聚合断言投影排序。这些在需要使用同一参数查询的多个部分或同一查询需要对各种参数值执行时很有用。

SearchScope<Book> scope = searchSession.scope( Book.class );
SearchPredicateFactory factory = scope.predicate();
SearchPredicate predefinedPredicate = factory.withParameters(
        params -> factory.bool() (1)
                .should( factory.match().field( "title" )
                        .matching( params.get( "title-param", String.class ) ) ) (2)
                .filter( factory.match().field( "genre" )
                        .matching( params.get( "genre-param", Genre.class ) ) ) (3)
).toPredicate();

List<Book> crimeBooks = searchSession.search( Book.class )
        .where( predefinedPredicate ) (4)
        .param( "title-param", "robot" )  (5)
        .param( "genre-param", Genre.CRIME_FICTION )
        .fetchHits( 20 );

List<Book> scienceFictionBooks = searchSession.search( Book.class )
        .where( predefinedPredicate ) (6)
        .param( "title-param", "spaceship" ) (7)
        .param( "genre-param", Genre.SCIENCE_FICTION )
        .fetchHits( 20 );
1 开始创建 .withParameters() 断言。
2 在构建断言时访问查询参数 title-paramString 类型。
3 在构建断言时访问查询参数 genre-paramGenre 枚举类型。
4 在查询中使用预定义的参数化断言。
5 在查询级别设置断言所需的参数。
6 在查询中重用预定义的参数化断言。
7 在查询级别设置断言所需的另一组参数。

@DistanceProjection 将构造函数参数映射到距离投影

随着查询参数的引入,现在可以在投影构造函数中定义可用的 @DistanceProjection

@ProjectionConstructor
public record MyAuthorPlaceProjection(
        @DistanceProjection( (1)
                fromParam = "point-param", (2)
                path = "placeOfBirth") (3)
        Double distance ) {
}
1 使用 @DistanceProjection 标注应接收距离值的参数。
2 指定将用于计算距离的查询参数。
3 可选地,自定义路径,因为实体的 GeoPoint 属性可能不同于投影中的距离属性。
List<MyAuthorPlaceProjection> hits = searchSession.search( Author.class )
        .select( MyAuthorPlaceProjection.class )
        .where( f -> f.matchAll() )
        .param( "point-param", GeoPoint.of( latitude, longitude ) ) (1)
        .fetchHits( 20 );
1 传递具有与 @DistanceProjection 中投影构造函数的 fromParam 相同名称的查询参数值 point-param

文档树投影

使用 Lucene 后端,现在可以请求文档树投影。此新的 .documentTree() 投影将匹配的文档作为包含本地 Lucene Document 和相应嵌套树节点的树返回。

List<DocumentTree> hits = searchSession.search( Book.class )
        .extension( LuceneExtension.get() )
        .select( f -> f.documentTree() )
        .where( f -> f.matchAll() )
        .fetchHits( 20 );

DocumentTree documentTree = hits.get( 0 );
Document rootDocument = documentTree.document();
Map<String, Collection<DocumentTree>> nestedDocuments = documentTree.nested();
// ...

其他改进和错误修复

  • HSEARCH-4572:使用比搜索查询范围更广的 SearchPredicate/SearchProjection/SearchSort。

  • HSEARCH-4929:在使用Jakarta Batch集成启动大规模索引时,添加一个选项来删除和创建模式。

  • HSEARCH-4963:运行给定字符串的分析的API。

  • HSEARCH-5006:非字符串租户标识符

  • HSEARCH-5016:当使用numberOfFragments(1)时,允许将@HighlightProjection绑定到单个值的String(而不是List

  • HSEARCH-5039:修复knn谓词的租户过滤器,并将其用作knn谓词的过滤器

  • HSEARCH-5124:Jakarta Batch作业参数purgeAllOnStart现在将只清除entityTypes中指定的类型的文档,而不是清除所有文档。

还有更多。有关自上次发布以来的完整更改列表,请参阅发布说明

如何获取此版本

所有详细信息均可在hibernate.org上的专用页面上找到并保持最新。

入门,迁移

要取得联系,请使用以下渠道

hibernate-search标签在Stackoverflow上(使用问题)


返回顶部