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

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

这个版本带来了更简单的and/or/not谓词、多个租户的大规模索引,以及在outbox-polling协调策略中将标识符切换为UUID。

6.2.0.Alpha2还包括许多错误修复和改进,与Elasticsearch 8.6和OpenSearch 2.5的兼容性,将-orm6工件升级到Hibernate ORM 6.2.0.CR2,等等。

新增功能

Hibernate Search 6.2仍在开发中:一些功能可能还不完整或可能以不兼容的方式更改。

依赖升级

Hibernate ORM (HSEARCH-4747/HSEARCH-4791)

Hibernate Search现在依赖于Hibernate ORM 5.6.14.Final,或Hibernate ORM 6.2.0.CR2用于-orm6工件。

Elasticsearch (HSEARCH-4777)

Elasticsearch后端现在可以与Elasticsearch 8.6以及其他已经兼容的版本一起工作。

OpenSearch (HSEARCH-4790)

Elasticsearch后端现在可以与OpenSearch 2.5以及其他已经兼容的版本一起工作。

其他

独立 POJO 映射器

独立 POJO 映射器允许将任意 POJO 映射到索引中,即使没有 Hibernate ORM。有关更多信息,请参阅参考文档的本节,或本入门指南

在本版本中,对独立 POJO 映射器的配置进行了多项改进

  • HSEARCH-4615: 通过配置属性设置更多配置更加简单。

  • HSEARCH-4620: 索引计划同步现在通过策略配置,就像 ORM 映射器一样。

将索引内容映射到自定义类型(投影构造函数)

在之前的版本中,Hibernate Search 6.2 引入了通过映射自定义类型(通常是记录)来定义投影的能力,通过将 @ProjectionConstructor 注解应用到这些类型或其构造函数上。有关更多信息,请参阅参考文档的本节

在本版本中,对投影构造函数进行了多项改进

  • HSEARCH-4579: 使用独立 POJO 映射器时,如果对未配置加载的实体类型进行搜索,Hibernate Search 现在将尝试使用该实体类型的投影构造函数(如果存在)。

  • HSEARCH-4591: 现在允许在 Lucene 后端对单值、扁平化对象字段使用对象投影。

  • HSEARCH-4669: 当投影构造函数无法应用于索引时,Hibernate Search 将提供更多信息。

  • HSEARCH-4673: 使用记录的默认构造函数作为投影构造函数时,不再需要 -parameters 编译器标志。

映射改进

  • HSEARCH-4714: 映射中的属性名称,例如 @IndexingDependency(derivedFrom = …​),现在将进行早期检查,以便在出现语法错误时提供清晰的错误消息。

  • HSEARCH-4782: Hibernate Search 现在将自动推断 Hibernate ORM 实体的标识符的默认小数位数,之前它仅对非标识符属性进行推断。

搜索 DSL 改进

使用 and/or/not 谓词进行更简单的布尔运算符(HSEARCH-4601/HSEARCH-4645

对于更简单的用例,您现在可以避免使用相当复杂的 bool 谓词,而是使用新的 and/or/not 谓词

List<Book> hits = searchSession.search( Book.class )
        .where( f -> f.and(
                        f.match().field( "title" )
                                .matching( "robot" ),
                        f.match().field( "description" )
                                .matching( "crime" )
        ) )
        .fetchHits( 20 );
List<Book> hits = searchSession.search( Book.class )
        .where( f -> f.or(
                        f.match().field( "title" )
                                .matching( "robot" ),
                        f.match().field( "description" )
                                .matching( "investigation" )
        ) )
        .fetchHits( 20 );
List<Book> hits = searchSession.search( Book.class )
        .where( f -> f.not(
                f.match()
                        .field( "genre" )
                        .matching( Genre.SCIENCE_FICTION )
        ) )
        .fetchHits( 20 );
更简单且适用于 where( (f, b) → …​ )and 断言 (HSEARCH-4676)

与 6.2.0.Alpha1 中的 bool 断言相比,现在的 where( (f, b) → …​ ) 提供了一个更简单的 and 断言

MySearchParameters searchParameters = getSearchParameters();
List<Book> hits = searchSession.search( Book.class )
        .where( (f, root) -> {
            root.add( f.matchAll() );
            if ( searchParameters.getGenreFilter() != null ) {
                root.add( f.match().field( "genre" )
                        .matching( searchParameters.getGenreFilter() ) );
            }
            if ( searchParameters.getFullTextFilter() != null ) {
                root.add( f.match().fields( "title", "description" )
                        .matching( searchParameters.getFullTextFilter() ) );
            }
            if ( searchParameters.getPageCountMaxFilter() != null ) {
                root.add( f.range().field( "pageCount" )
                        .atMost( searchParameters.getPageCountMaxFilter() ) );
            }
        } )
        .fetchHits( 20 );
更简单的 and 断言,适用于 nested 断言 (HSEARCH-4676)

与 6.2.0.Alpha1 中的 bool 断言相比,现在的 f.nested( …​ ) 提供了一个更简单的 and 断言

List<Book> hits = searchSession.search( Book.class )
        .where( f -> f.nested( "authors" )
                .add( f.match().field( "authors.firstName" )
                        .matching( "isaac" ) )
                .add( f.match().field( "authors.lastName" )
                        .matching( "asimov" ) ) )
        .fetchHits( 20 );

大规模索引改进

支持多租户的大规模索引 (HSEARCH-4321)

在多租户应用程序中,现在可以在创建大规模索引器时不传递任何租户标识符,并在 Hibernate Search 配置中提供租户列表的情况下,同时处理多个租户。有关更多信息,请参阅参考文档的本节

大规模索引期间设置线程局部变量 (HSEARCH-1809)

大规模索引器现在有一个“大规模索引环境”的概念,允许在大量索引线程中设置自定义线程局部变量。有关更多信息,请参阅参考文档中的此部分

更好的异常处理 (HSEARCH-4541)

在大量索引期间,Hibernate ORM 抛出的异常现在会像其他异常一样传递给失败处理器,而不是终止整个大量索引。

参数的更智能的默认值 (HSEARCH-4612)

dropAndCreateSchemaOnStart 被启用时,massIndexer 中现在默认禁用 purgeAllOnStart

outbox-polling 协调改进

出盒事件和代理现在使用 UUID 作为它们的标识符 (HSEARCH-4678/HSEARCH-4748)

相关表的键现在使用 UUID 而不是长整型,以避免依赖于导致某些数据库上事件处理速度变慢的序列。迁移指南包括必要的数据库模式更改的迁移脚本。有关更多信息,请参阅参考文档的本节

其他改进和错误修复

  • HSEARCH-4618:现在 BooleanPredicateOptionsCollector/SimpleBooleanPredicateClausesCollector 提供了 hasClause() 方法。

  • HSEARCH-4294:搜索 DSL 现在允许针对隐式 Elasticsearch 字段,如 _index

  • HSEARCH-4644:Hibernate Search 现在定期针对 CockroachDB 进行测试。

  • HSEARCH-4679:Hibernate Search 现在将自动简化只有一个子句的布尔断言。

  • HSEARCH-4305HSEARCH-4708:当更改带有 @OneToOne(mappedBy = …​) @IndexedEmbedded 注解的属性时,将不再跳过自动重新索引。

  • HSEARCH-4727:使用 outbox-polling 协调和 DB2 时,以前使用的 OutboxEvent 表带有错误类型的 payloadblob(255),使其几乎无法使用。现在不再是这种情况。

  • HSEARCH-4634HSEARCH-4647:现在 outbox-polling 协调与 CockroachDB 一起工作。

  • HSEARCH-4652: 当将searchAnalyzer设置为与全文字段上的analyzer相同值时,使用Elasticsearch后端进行模式验证将不再失败。

  • HSEARCH-4654: Hibernate Search在启动或模式验证期间遇到大量并发失败时将不再发生死锁。

  • HSEARCH-4701: 当以Java模块(在modulepath中)运行Hibernate Search时,Elasticsearch模式管理将不再导致由于缺少模块间依赖而引发的异常。

  • HSEARCH-4703: 修复了hibernate-search-mapper-orm-coordination-outbox-polling的Java模块描述符中缺失条目,避免了在modulepath中运行Hibernate Search时出现错误。

  • HSEARCH-4724: 类路径扫描(特别是针对投影构造函数)不再忽略Spring Boot的"repackaged" JAR中的类。

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

如何获取此版本

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

入门,迁移

对于新应用,请参考以下指南以进行Hibernate ORM集成

对于现有应用,假设您还升级了依赖项,Hibernate Search 6.2是6.1的即插即用替代品。有关已弃用配置和API的信息包含在迁移指南中。

反馈、问题、想法?

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


回到顶部