我们刚刚发布了Hibernate Search 6.0.0.Beta3。这个版本主要带来了模式改进、对Elasticsearch搜索请求的深度定制、更强大的桥定义,并恢复了搜索查询超时等特性。它还包括了对Lucene 8.3.0、Elasticsearch 7.5和Hibernate ORM 5.4.10.Final的升级。
新增功能
模式改进
我们对每个文档中存储的元数据字段(标识符、类型等)进行了多项改进,以确保只存储绝对必要的部分,并依赖doc-values而不是存储字段(HSEARCH-3657)。
此外,在Elasticsearch后端,我们添加了一个新的_entity_type
字段,以更好地处理针对索引别名的多索引搜索查询(HSEARCH-3765),并更改了用于基于区分符的多租户的字段名称(现在为_tenant_id
和_tenant_doc_id
,请参阅HSEARCH-3788)。
这些改进是有代价的:在从Beta2升级到Beta3时,需要重新索引现有数据。
Elasticsearch搜索请求的深度定制
在HSEARCH-3496中,引入了新的API,允许操作Elasticsearch搜索请求的JSON并检索原始JSON响应。这允许利用Elasticsearch中尚未在Search DSL中提供的功能,例如建议器,同时在可能的情况下仍利用DSL(如match
谓词、排序、投影等)。有关更多信息,请参阅文档的该部分。
此外,自HSEARCH-3662以来,现在可以直接将Elasticsearch聚合定义为JSON,以便访问尚未通过DSL公开的聚合类型。有关示例,请参阅文档的该部分。
更强大的桥定义
桥接获得了几个改进
-
HSEARCH-3135:自定义映射注解的概念被简化了:它不再仅限于类型桥和属性桥,现在也可以用于值桥。实际上,自定义注解现在可以应用几乎所有的映射功能:桥接、索引内嵌、标记类型为索引等。
-
HSEARCH-3717:
ValueBinder
不再仅限于标准字段类型:现在可以将值绑定到更奇特的字段类型,例如内容直接定义为JSON的“原生”Elasticsearch字段。 -
HSEARCH-3766:自定义注解现在对于类型和属性桥是可选的。要应用未定义专用注解的桥接,只需将内置的
@TypeBinding(…)
/@PropertyBinding(…)
注解应用于类型/属性,并将其属性设置为对您的绑定器的引用。这种方式应用的桥接不能进行参数化。
有关桥接和如何使用它们的最新信息,请参阅参考文档中的专用部分。
exists
谓词现在可以针对对象字段
Search 6中引入的exists
谓词现在可以针对对象字段(HSEARCH-2389)。如果对象字段在给定文档中至少有一个现有的(非null)子字段,则该字段将视为在该文档中存在。
在下面的示例中,所有具有至少一个非null索引字段的客户端都将出现在结果中
List<Client> clientsWithAtLeastOneOrder = searchSession.search(Client.class)
.predicate(f -> f.exists().field("orders"))
.fetch( 20 );
搜索查询超时已恢复
自HSEARCH-3352以来,现在可以再次设置搜索查询的超时,类似于Search 5中的情况。
有两种类型的时间超时可用
-
failAfter(long, TimeUnit)
:一个“硬”超时,将终止搜索查询并抛出异常; -
truncateAfter(long, TimeUnit)
:一个“软”超时,将停止结果收集并返回截断的结果。
这些超时对于Lucene后端和Elasticsearch后端都可用。
此外,自HSEARCH-3456以来,现在SearchResult
接口公开了有关查询执行时间(getTook()
)的信息,以及一个指示查询是否超时的标志(isTimedOut()
)。
有关更多信息,请参阅参考文档中的该专用部分。
版本升级
-
HSEARCH-3758: 升级到 Lucene 8.3.0
-
HSEARCH-3782: 升级到 Elasticsearch 7.5.0
-
HSEARCH-3781: 升级到 Hibernate ORM 5.4.10.Final
Hibernate Search 6 需要 ORM 5.4.4.Final 或更高版本才能正确工作。早期的 5.4.x 版本将无法正确工作。 |
向后不兼容的 API 变更
-
配置
-
HSEARCH-3756: 多值配置属性现在必须使用逗号作为分隔符进行指定,而不是空格。这特别影响 Elasticsearch 主机的配置。
-
HSEARCH-3757: 用于联系 Elasticsearch 的协议(
http
或https
)现在必须单独在专用的hibernate.search.backends.<backend name>.protocol
属性中指定。它不能再作为hibernate.search.backends.<backend name>.hosts
属性的一部分指定。
-
-
桥梁
-
HSEARCH-3135:
*Binder
接口不再具有泛型类型参数或initialize()
方法。现在通过使用@TypeMapping
或@PropertyMapping
对自定义注解进行元注解,并实现专用接口TypeMappingAnnotationProcessor
或PropertyMappingAnnotationProcessor
来实现自定义注解(对于桥梁或其他用途)的处理。不需要接受参数的绑定器可以直接使用内置的@TypeBinding
或@PropertyBinding
注解应用于类型/属性。 -
HSEARCH-3748: 删除了程序化 API 中有关桥梁的一些无法正常工作的方法。
-
-
其他
-
HSEARCH-3712: 定义字段类型上的 DSL 转换器和投影转换器的 API 现在使用不同的、更简单的接口。
-
HSEARCH-3761: 现在使用 GSON 类型(
JsonObject
、JsonElement
等)而不是字符串来处理产生或接受 JSON 的 Elasticsearch API。
-
文档
-
HSEARCH-3750: 在文档 TOC 中使用自动扩展条目
-
HSEARCH-3711: 索引字段类型 DSL 扩展现在有文档说明:[Lucene](https://docs.jboss.com.cn/hibernate/search/6.0/reference/en-US/html_single/#backend-lucene-field-types-extension) 和 [Elasticsearch](https://docs.jboss.com.cn/hibernate/search/6.0/reference/en-US/html_single/#backend-elasticsearch-field-types-extension)。
-
HSEARCH-3753: 与定义自定义
ContainerExtractor
实现相关的 API 现已正确标记为实验性。
其他改进和错误修复
-
HSEARCH-1401: 允许集成者声明结构由程序定义的实体("自由形式")。
-
HSEARCH-3634: 清晰显示缺少
@IndexingDependency
注解的@javax.persistence.Transient
属性时的错误消息。 -
HSEARCH-3764: 现在可以在
id()
谓词中禁用值转换,以便直接传递文档 ID(字符串)。 -
HSEARCH-3783: 使用投影或多租户时,Elasticsearch 后端的
query.explain()
不再失败。 -
HSEARCH-3693: 恢复了来自 Search 5 的某些缺失的日志消息,特别是启动时显示的 Hibernate Search 版本。
等等。有关自上次发布以来的所有更改的完整列表,请参阅 发行说明。
如何获取此版本
所有详细信息均可在 hibernate.org 上的专用页面 上找到并保持最新。