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

我们刚刚发布了Hibernate Search 6.0.0.Beta3。这个版本主要带来了模式改进、对Elasticsearch搜索请求的深度定制、更强大的桥定义,并恢复了搜索查询超时等特性。它还包括了对Lucene 8.3.0、Elasticsearch 7.5和Hibernate ORM 5.4.10.Final的升级。

开始使用Hibernate Search 6

如果您想直接进入新版本的Hibernate Search 6,参考文档中的入门指南是一个很好的起点。

Hibernate Search 6的API与Search 5有显著差异。

有关迁移信息以及我们打算如何帮助您的详细信息,请参阅迁移指南

新增功能

模式改进

我们对每个文档中存储的元数据字段(标识符、类型等)进行了多项改进,以确保只存储绝对必要的部分,并依赖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-3717ValueBinder不再仅限于标准字段类型:现在可以将值绑定到更奇特的字段类型,例如内容直接定义为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())。

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

版本升级

Hibernate Search 6 需要 ORM 5.4.4.Final 或更高版本才能正确工作。早期的 5.4.x 版本将无法正确工作。

向后不兼容的 API 变更

  • 配置

    • HSEARCH-3756: 多值配置属性现在必须使用逗号作为分隔符进行指定,而不是空格。这特别影响 Elasticsearch 主机的配置。

    • HSEARCH-3757: 用于联系 Elasticsearch 的协议(httphttps)现在必须单独在专用的 hibernate.search.backends.<backend name>.protocol 属性中指定。它不能再作为 hibernate.search.backends.<backend name>.hosts 属性的一部分指定。

  • 桥梁

    • HSEARCH-3135: *Binder 接口不再具有泛型类型参数或 initialize() 方法。现在通过使用 @TypeMapping@PropertyMapping 对自定义注解进行元注解,并实现专用接口 TypeMappingAnnotationProcessorPropertyMappingAnnotationProcessor 来实现自定义注解(对于桥梁或其他用途)的处理。不需要接受参数的绑定器可以直接使用内置的 @TypeBinding@PropertyBinding 注解应用于类型/属性。

    • HSEARCH-3748: 删除了程序化 API 中有关桥梁的一些无法正常工作的方法。

  • 其他

    • HSEARCH-3712: 定义字段类型上的 DSL 转换器和投影转换器的 API 现在使用不同的、更简单的接口。

    • HSEARCH-3761: 现在使用 GSON 类型(JsonObjectJsonElement 等)而不是字符串来处理产生或接受 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 上的专用页面 上找到并保持最新。

反馈、问题、想法?

要联系,请使用以下渠道


返回顶部