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

我们刚刚发布了 Hibernate Search 6.0.0.Beta2。此版本主要引入了搜索分析器、改进了后台故障处理,并升级到 Elasticsearch 7.4 和 Hibernate ORM 5.4.7.Final。

开始使用 Hibernate Search 6

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

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

有关迁移和我们将如何帮助您的更多信息,请参阅 迁移指南

新增功能

搜索分析器

HSEARCH-3042 以来,现在可以为每个字段定义一个“搜索分析器”,这样在索引时使用一个分析器,在查询时使用另一个分析器。这对于实现带有边缘词元过滤器的自动补全(“边写边搜”)非常有用。

例如

@Entity
@Indexed
public class Book {

        @Id
        private Long id;

        @FullTextField(
                        name = "title_autocomplete",
                        analyzer = "autocomplete", (1)
                        searchAnalyzer = "autocomplete_query" (2)
        )
        private String title;

        // ... getters and setters ...
}
1 在索引时应用 autocomplete 分析器(在其他地方定义),它将标准化文本,然后生成边缘 n-gram。
2 在查询时应用 autocomplete-query 分析器(在其他地方定义),它将标准化文本,但 不会 生成边缘 n-gram。

在上面的例子中

  • 在索引时,索引文本 QuicK FOX 将生成以下标记:qququiquicquickffofox,而索引文本 quid pro quo 将生成以下标记:qququiquidpprproqququo

  • 在查询时,查询字符串 quic 只会生成标记 quic

因此,查询字符串 quic 将匹配包含 QuicK FOX 的文档,但不会匹配仅包含 quid pro quo 的文档。

如果没有搜索分析器,查询字符串 quic 将会使用 autocomplete 分析器进行解析,这将生成标记 qququiquic。因此,查询将匹配 quid pro quo(它与查询有共同的标记 qququi),这显然不是预期的行为。

有关搜索分析器的更多信息,请参阅文档中的此段落,以及有关一般分析的更多信息,请参阅“分析”部分

背景故障处理

已经恢复了与 Hibernate Search 5 类似的背景故障处理支持,并进行了重大改进。

与 Hibernate Search 5 类似

  • 在后台线程中发生的无法传播异常到用户线程的故障(例如,Lucene 合并线程中的故障)将被记录。

  • 您可以通过插入自定义组件来不同地报告异常:与 Search 5 的 ErrorHandler 类似的 FailureHandler。有关更多信息,请参阅文档中的专用部分

然而,与 Hibernate Search 5 相比,更多故障将传播到用户线程(Hibernate Search 将抛出一个包含故障详细信息的异常)。特别是

  • 使用 committedsearchable 同步策略(有关详细信息,请参阅文档中的该部分)进行自动索引时的索引失败。

  • 显式索引操作的失败。

  • 在大量索引期间,清除、优化或刷新操作的失败。在这种情况下,失败也将报告给故障处理器。

  • 在大量索引期间,实体索引的失败。在这种情况下,失败也将报告给故障处理器。

在 Hibernate Search 5 中,大量索引不会因为索引一个实体失败而停止。

同样,在大量索引期间实体索引失败的情况下,Hibernate Search 6 仍然会尝试重新索引每个相关实体。不同之处在于,在大量索引完成后,它会抛出一个异常,包含失败实体的数量和第一次失败的详细信息。其他失败的详细信息仍然推送到故障处理器。

版本升级

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

不兼容 API 的更改

  • HSEARCH-3720:模块 hibernate-search-mapper-pojo 新增了一个工件标识符:hibernate-search-mapper-pojo-base。由于此模块通常作为传递依赖项被拉取,因此这将对非常少数的应用程序产生影响。

  • HSEARCH-3721:已从 6.0.0.Beta1 中移除所有已废弃的方法。

    • 搜索会话

      • Search.getSearchSession(…):使用 Search.session(…) 代替。

      • createIndexer(…):使用 massIndexer(…) 代替。

    • 在获取查询结果时

      • fetch()(无任何参数):考虑传递一个限制(例如 fetch(20))。如果您真的想获取所有命中项,请使用 fetchAll()

      • fetchHits()(无任何参数):考虑传递一个限制(例如 fetchHits(20))。如果您真的想获取所有命中项,请使用 fetchAllHits()

    • 在谓词 DSL 中

      • onField(String)/onFields(String…)/orField(String)/orFields(String…)/onObjectField(String):使用 field(String)/fields(String…)/objectField(String) 代替。

      • boostedTo(float):使用 boost(float) 代替。

      • withConstantScore():使用 constantScore() 代替。

      • withSlop(int):使用 slop(int) 代替。

      • 范围谓词的 from(…)/above(…)/below(…):使用 between(…)/atLeast(…)/atMost(…)/greaterThan(…)/lessThan(…) 代替,或对于更复杂的使用情况,使用 range(…)

      • withAndAsDefaultOperator():使用 defaultOperator(BooleanOperator.AND) 代替。

    • 在排序 DSL 中

      • 例如 by*() 方法,如 byField(…)byDistance(…) 等:使用不带 by 前缀的版本,例如 field(…)distance(…)

      • onMissingValue()/sortLast()/sortFirst():使用 missing()/last()/first() 代替。

    • 在 Elasticsearch 分析定义 DSL 中:使用 withTokenizerwithTokenFilterswithCharFilters。使用不带 with 前缀的方法。

  • AutomaticIndexingSynchronizationStrategy,理论上用户可以实现高级用例,已重写以允许对有关 后台故障处理 的改进。有关此接口及其实现的更多信息,请参阅 javadoc。

其他改进和错误修复

  • HSEARCH-1108:程序化 API 对于具有 @MappedSuperclass 父类的实体不正确。

  • HSEARCH-3084:并行初始化和关闭索引管理器/后端。

  • HSEARCH-3684:@IndexedEmbedded.includePaths 在某些情况下包含过多的字段。

  • HSEARCH-3694:现在正确处理嵌套字段中的单值距离排序。

  • HSEARCH-3193:现在 Lucene 后端正确处理降序距离排序。

  • HSEARCH-3640:通过 ORM 映射器 API 暴露后端/索引。

等等。有关自上一版本以来的完整更改列表,请参阅 发布说明

如何获取此版本

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

反馈、问题、想法?

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


返回顶部