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

我们刚刚发布了 Hibernate Search 6.0.0.Beta9。

这次发布主要引入了更简单的配置属性方案、一个新的滚动 API、对多值字段的投影支持,以及所有当前实现功能的完整文档。

它还包括了对 Lucene 8.6.0、Elasticsearch 7.8.0 和 Hibernate ORM 5.4.19.Final 的升级。

开始使用 Hibernate Search 6

如果您想直接开始使用全新的 Hibernate Search 6,参考文档中的 入门指南 是一个很好的起点。

Hibernate Search 6 API 与 Hibernate Search 5 有显著不同。

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

新特性

更简单的配置方案

对 Hibernate Search 处理配置属性的方法的几项改进应该会简化您的配置文件的外观。

特别是

  • HSEARCH-3950: 默认后端现在有一个专用的前缀(hibernate.search.backend),这意味着单后端应用程序不再需要使用繁琐的命名后端方案(hibernate.search.backends.myBackend.[…​] = […​] + hibernate.search.default_backend = myBackend)。

  • HSEARCH-3102: 如果类路径中只有一个后端技术,则不再需要后端类型。

  • HSEARCH-3967: 索引级配置属性的默认值现在可以在后端级别提供,不再需要 index_defaults. 前缀。

例如,这

hibernate.search.default_backend myBackend
hibernate.search.backends.myBackend.type elasticsearch
hibernate.search.backends.myBackend.hosts es.mycompany.com:9200
hibernate.search.backends.myBackend.index_defaults.indexing.queue_count 4

现在可以更简单地写成这样

hibernate.search.backend.hosts es.mycompany.com:9200
hibernate.search.backend.indexing.queue_count 4

滚动API

截至 HSEARCH-3323,一个新的滚动API现已可用。

滚动保证了所有返回的命中结果都是一致的(没有重复),这使得它非常适合以小块处理大量结果集。

try ( SearchScroll<Book> scroll = searchSession.search( Book.class )
        .where( f -> f.matchAll() )
        .scroll( 20 ) ) {
    for ( SearchScrollResult<Book> chunk = scroll.next();
            chunk.hasHits(); chunk = scroll.next() ) {
        for ( Book hit : chunk.hits() ) {
            // ... do something with the hits ...
        }
        entityManager.flush();
        entityManager.clear();
    }
}

有关更多信息,请参阅文档的本节

多值字段的投影

截至 HSEARCH-3391/HSEARCH-3944,现在可以将投影针对多值字段。

只需在您的投影上调用 .multi(),它将自动变为返回 List<T> 的投影,其中 T 是您的字段类型

List<List<String>> hits = searchSession.search( Book.class )
        .select( f -> f.field( "authors.lastName", String.class ).multi() )
        .where( f -> f.matchAll() )
        .fetchHits( 20 );

版本升级

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

重大变更

  • HSEARCH-3899query.explain()现在期望传递实体ID而不是文档ID。简而言之,如果您的实体ID类型为Long,则需要传递Long(以前您必须传递String)。

  • HSEARCH-3939:在Lucene后端中存储GeoPoint字段的内部格式已更改。依赖于Lucene后端并声明GeoPoint字段的应用程序应完全重新索引其数据。

  • HSEARCH-3948@IndexedEmbedded.storage/ObjectFieldStorage已重命名为@IndexedEmbedded.structure/ObjectStructure。旧的语法已弃用,将在6.0.0.Final发布之前删除。

文档

其他改进和错误修复

  • HSEARCH-3636:现在可以按索引级别定义 Lucene 目录,这使得将索引放在完全不同的文件系统上变得更容易。

  • HSEARCH-3311:Hibernate Search 5中的分析器区分器不再可用,但现在已记录了针对同一问题的不同解决方案:替代绑定器

  • HSEARCH-3929:Hibernate Search现在使用JDK11构建。二进制文件仍然与JDK8兼容,目前没有计划移除该兼容性。

  • HSEARCH-3307:当针对单个搜索查询中的多个索引时,现在对字段兼容性的检测更智能,并且不会产生假阴性。

  • HSEARCH-3941:当针对单个搜索查询中的多个索引时,距离排序将不再抛出 ClassCastException

  • HSEARCH-3266:使用来自Hibernate Search 5的配置属性现在会导致引导失败,以避免配置错误迁移的情况。

  • HSEARCH-3936:使用Elasticsearch后端的项目字段现在在生成的映射中不再标记为 stored = true

  • HSEARCH-3938:现在在使用 EnvironmentSynchronizer(通常在JavaEE应用程序服务器中)时,Hibernate Search 6将正确启动和关闭。

  • HSEARCH-3937:现在在使用 EnvironmentSynchronizer(通常在JavaEE应用程序服务器中)时,引导/关闭错误信息将正确显示。

  • HSEARCH-3506:现在可以在 matchAllmatchIdboolnested 断言上使用 .boost(float)

  • HSEARCH-3960:Elasticsearch模式验证失败现在更清楚地指出它们是关于对现有Elasticsearch集群中现有索引的现有模式进行验证。

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

如何获取此版本

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

反馈、问题、想法?

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


返回顶部