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

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

这个版本带来了搜索 DSL 中的高亮显示、用于暂停自动索引的索引计划过滤器、Elasticsearch 架构导出工具、使用 @ProjectionConstructor 时的构造函数参数映射注解,以及在排序中的 .missing().lowest()/.missing().highest() 选项。

6.2.0.Beta1 还包括许多错误修复和改进,与 Elasticsearch 8.8 和 OpenSearch 2.7 兼容,将 -orm6 艺术品升级到 Hibernate ORM 6.2.4.Final,等等。

新增功能

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

依赖升级

Hibernate ORM (HSEARCH-4860)

Hibernate Search 现在依赖于 Hibernate ORM 6.2.4.Final 的 -orm6 艺术品。

Elasticsearch (HSEARCH-4857)

现在,Elasticsearch 后端不仅可以与 Elasticsearch 8.8 一起使用,还可以与其他已经兼容的版本一起使用。

OpenSearch (HSEARCH-4850)

现在,Elasticsearch 后端不仅可以与 OpenSearch 2.7 一起使用,还可以与其他已经兼容的版本一起使用。

其他

高亮显示

通过 HSEARCH-2192,Hibernate Search 现在在搜索 DSL 中提供一项新功能:高亮显示。

高亮显示是一种投影,它从匹配的文档的全文字段中返回引起查询匹配的片段。导致匹配的特定术语使用一对开始和结束标签进行“高亮显示”。这可以帮助用户快速识别他们在结果页面上搜索的信息。

例如,可以这样在全文字段上启用高亮显示

@Entity
@Indexed
public class Book {
    @Id
    private Integer id;

    @FullTextField(analyzer = "english")
    private String title;

    @FullTextField(analyzer = "english", highlightable = Highlightable.ANY)
    private String description;
}

然后可以这样检索高亮显示

SearchSession searchSession = /* ... */

List<List<String>> result = searchSession.search( Book.class )
        .select( f -> f.highlight( "description" ) )
        .where( f -> f.match().field( "description" ).matching( "robot" ) )
        .fetchHits( 20 );

例如,可以返回以下高亮显示

# Hit #0
["A <em>robot</em> becomes self-aware."]
# Hit #1
["A <em>robot</em> helps investigate a murder on an extrasolar colony.",
 "On this planet, <em>robots</em> are used extensively."]
# etc.

这是一个简单的例子,但高亮显示可以广泛配置。有关更多信息,请参阅参考文档的此部分

索引计划过滤器

通过 HSEARCH-168/HSEARCH-1383,Hibernate Search 现在允许在索引计划中启用/禁用索引(包括尤其是自动索引),可以是完全的(对所有类型)或基于类型的。

例如,以下操作将禁用类 Company 的所有实例的自动索引,但不包括其子类 Customer 的实例

SearchMapping searchMapping = /* ... */
searchMapping.indexingPlanFilter(
        ctx -> ctx.exclude( Company.class )
                .include( Customer.class )
);

索引计划过滤器也可以按会话配置(尽管在outbox-polling 协调策略使用时有限制)

SearchSession searchSession = /* ... */
searchSession.indexingPlanFilter(
        ctx -> ctx.exclude( Company.class )
                .include( Customer.class )
);

有关更多信息,请参阅参考文档的此部分

使用 @ProjectionConstructor 时的映射注解

HSEARCH-4574 添加了使用 @ProjectionConstructor 时的映射注解。

这意味着您现在可以使用 @ProjectionConstructor 将投影到除了字段之外的其他内容,例如实体标识符。

@ProjectionConstructor
public record MyBookIdAndTitleProjection(
        @IdProjection (1)
        Integer id,
        String title (2)
) {
}
1 投影到实体标识符(通过显式注解的显式投影)
2 投影到字段 title(隐式投影)

但这还允许更精确地配置字段投影,例如将字段投影的路径设置为目标构造参数名称之外的内容

@ProjectionConstructor
public record MyBookTitleAndAuthorNamesProjection(
        @FieldProjection (1)
        String title,
        @FieldProjection(path = "authors.lastName") (2)
        List<String> authorLastNames
) {
}
1 投影到字段 title(路径从构造参数名称派生)
2 投影到字段 authors.lastName(显式路径)

有关此功能的一般信息,请参阅参考文档的此部分,以及有关每个可用注解的更多信息,请参阅每个投影的文档

搜索 DSL 改进

.missing().lowest()/.missing().highest() 选项在排序中(HSEARCH-4149

在根据可能没有值的字段进行排序时,已经可以使用 .missing().first()/.missing().last() 来告诉 Hibernate Search 将此类文档放在第一/最后位置(分别),而不管排序顺序(升序/降序)如何。

现在,可以使用 .missing().lowest()/.missing().highest() 作为替代方案,告诉 Hibernate Search 将此类文档视为具有最低/最高值(分别),考虑到排序顺序(升序/降序)。

  • .missing().lowest() 在使用升序排序时将没有值的文档放在第一位,在降序排序时放在最后一位。

  • .missing().highest() 在使用升序排序时将没有值的文档放在最后一位,在降序排序时放在第一位。

这在缺失值的位置是硬编码,但排序顺序由用户给出时非常有用。

SortOrder orderFromUser = /* ... */;
List<Book> hits = searchSession.search( Book.class )
        .where( f -> f.matchAll() )
        .sort( f -> f.field( "pageCount" ).missing().lowest().order( orderFromuser ) )
        .fetchHits( 20 );

Elasticsearch 架构导出

现在可以将Hibernate Search期望的Elasticsearch模式导出为文件系统上的JSON文件。

SearchSchemaManager schemaManager = searchSession.schemaManager();
schemaManager.exportExpectedSchema( Path.of( "mydirectory" ) );

上述代码将产生类似于以下的目录树。

# For the default backend: backend/indexes/<index-name>/<file>
mydirectory/backend/indexes/customer/create-index.json
mydirectory/backend/indexes/customer/create-index-query-params.json
mydirectory/backend/indexes/order/create-index.json
mydirectory/backend/indexes/order/create-index-query-params.json
# For additional named backends: backend/<backend-name>/indexes/<index-name>/<file>
mydirectory/backends/auth/indexes/user/create-index.json
mydirectory/backends/auth/indexes/user/create-index-query-params.json
mydirectory/backends/auth/indexes/usergroup/create-index.json
mydirectory/backends/auth/indexes/usergroup/create-index-query-params.json

有关更多信息,请参阅参考文档中的该部分

其他改进和错误修复

  • HSEARCH-4808:为Elasticsearch客户端的连接保持活动添加了新的配置选项:hibernate.search.backend.max_keep_alive

  • HSEARCH-4772:现在在大量索引期间报告的非致命故障将限制在一定的故障数量内,这将防止这些故障使日志泛滥。该限制可以使用MassIndexer#failureFloodingThreshold(long)进行自定义。

  • HSEARCH-4843:现在已弃用各种模块特定的EntityReference接口;请改用通用的org.hibernate.search.engine.common.EntityReference

  • HSEARCH-4827:现在object投影将不允许不受嵌套影响的内部投影(例如idscore等)。

  • HSEARCH-4803:当适当的时候,Hibernate Search现在将正确地忽略内部ServiceConfigurationError

  • HSEARCH-4825:Hibernate Search生成的Elasticsearch动态模板现在将与自定义映射定义的模板合并,而不是在定义自定义映射时立即被擦除(即使自定义映射没有提及任何动态模板)。

  • HSEARCH-4853:Hibernate Search现在将正确处理在JDK 21-ea+21及以上版本中用作投影构造函数的规范记录构造函数。

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

如何获取此版本

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

入门,迁移

对于新应用程序,请参阅以下指南以了解如何进行Hibernate ORM集成

对于现有应用程序,在升级依赖项的情况下,Hibernate Search 6.2是6.1的即插即用替换品。有关弃用配置和API的信息包含在迁移指南中。

反馈、问题、想法?

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


返回顶部