我们刚刚发布了 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-4857: 升级到 Elasticsearch 客户端 8.8.0
-
高亮显示
通过 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
投影将不允许不受嵌套影响的内部投影(例如id
、score
等)。 -
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的信息包含在迁移指南中。