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

Hibernate Search 6 已经随着 6.0.0.Beta1 版本的发布达到了 Beta 状态。这次发布消除了最后一个主要障碍:它修复了 API 中剩余的少量不一致性,并完成了主要功能的文档。这次发布还引入了类似 Search 5 的分面功能的聚合。

Beta 状态的含义

基本上,达到 Beta 状态意味着 Hibernate Search 6 将从现在开始更加稳定

  • 最常用的 API 不再预期发生变化。

  • 实现已经过充分测试,按预期工作。

  • 参考文档涵盖了所有常见用例和大多数高级用例,并且在最终发布之前变化不大。

它仍然是 Beta 版本,而不是候选版本,因为最终发布之前仍然有很多工作要做

  • 一些不太常用的功能,如滚动或错误处理程序,仍然缺失。

  • 一些改进,如搜索分析器或零停机时间的大规模索引,仍然缺失。

  • 性能令人满意(没有明显的瓶颈),但需要更多彻底的测试。

  • 根据解决上述问题的需要,我们可能仍将在后续的 Beta 版本中更改索引格式,这需要重新索引。

开始使用 Hibernate Search 6

如果您想直接深入了解新的、令人兴奋的 Hibernate Search 6,参考文档中的 入门指南 是一个好起点。

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

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

新增内容

聚合 DSL

HSEARCH-3649 以来,Hibernate Search 6 现在提供了一种 DSL 来构建聚合,即基于给定搜索查询的所有命中结果进行聚合的结果。

目前支持的聚合相当简单,但将来会添加更多。

  • 术语聚合会产生每个给定字段值的命中次数。

    AggregationKey<Map<Genre, Long>> countsByGenreKey =
            AggregationKey.of( "countsByGenre" );
    SearchResult<Book> result = searchSession.search( Book.class )
            .predicate( f -> f.matchAll() )
            .aggregation( countsByGenreKey, f -> f.terms()
                    .field( "genre", Genre.class ) )
            .fetch( 20 );
    Map<Genre, Long> countsByGenre = result.getAggregation( countsByGenreKey );
  • 给定一系列范围,范围聚合会产生每个给定字段值范围的命中次数。

    AggregationKey<Map<Range<Double>, Long>> countsByPriceKey =
            AggregationKey.of( "countsByPrice" );
    SearchResult<Book> result = searchSession.search( Book.class )
            .predicate( f -> f.matchAll() )
            .aggregation( countsByPriceKey, f -> f.range()
                    .field( "price", Double.class )
                    .range( 0.0, 10.0 )
                    .range( 10.0, 20.0 )
                    .range( 20.0, null )
            )
            .fetch( 20 );
    Map<Range<Double>, Long> countsByPrice = result.getAggregation( countsByPriceKey );

这提供了Hibernate Search 5的“分面”功能所提供的所有功能,除了“钻取”之外,而“钻取”可以通过谓词 DSL 直观地重现。此外,新的聚合功能解决了Search 5中分面的一些长期问题。

  • HSEARCH-1372/HSEARCH-2111:聚合 API 使用清晰、一致的名字。

  • HSEARCH-2472/HSEARCH-2954:编码不再仅限于数值字段或文本:具有Java 8日期/时间类型的字段也可以进行聚合,例如LocalDate,并且它们使用Elasticsearch后端的专用date数据类型。

  • HSEARCH-1748:尝试在不受支持的字段上创建聚合现在将在构建查询期间触发异常,而不仅仅是返回空结果。

  • HSEARCH-2446:现在可以在由桥梁声明的字段上使用聚合(分面)。

  • 离散聚合不再需要将数字索引为文本。

版本升级

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

文档

HSEARCH-3270 以来,Hibernate Search 6的所有主要功能都已得到文档记录。

以下是自上次发布以来我们添加或完成的部分

向后不兼容的 API 变更

这次有很多向后不兼容的变更,因为这是Beta版之前的最后一批变更。

  • HSEARCH-3705:索引实体类型的默认索引名称现在是实体名称而不是完全限定类名

  • HSEARCH-3707:在SearchQuery.fetch(Integer, Integer)中的limit和offset参数已被交换

  • HSEARCH-3669:现在已弃用 fetch()fetchHits() 方法:请使用 fetchAllfetchAllHits 代替。

  • HSEARCH-3606:将 SearchWriter 重命名为 SearchWorkspace,将 SearchSessionWritePlan 重命名为 SearchIndexingPlan

  • HSEARCH-3623:分析定义 DSL 的语法已更新。

    • 现在无法再使用 Lucene 分析定义 DSL 将分析器/归一化器定义链式调用。

    • 在 Elasticsearch 分析定义 DSL 中,以 with 前缀的方法已弃用,现在推荐使用不带此前缀的新方法(withTokenizer()tokenizer())。

  • HSEARCH-3671SearchScope 现在是会话无关的。主要影响是您不能再写 scope.search():请使用 searchSession.search(scope) 代替。

  • HSEARCH-3691@GeoPointBinding 无法再用于 GeoPoint 类型的属性上:请使用 @GenericField 代替。

  • HSEARCH-3687:DSL 步骤接口的泛型类型参数已更改。这只会影响您将 DSL 步骤存储在变量中的情况,这不被推荐(您应该只是链式调用)。

  • HSEARCH-3708:范围谓词 DSL 现在通过新的 Range 类提供了定义匹配范围的语法。旧语法仍然有效,但已弃用。

  • HSEARCH-1347:

    • org.hibernate.search.mapper.pojo.dirtiness.ReindexOnUpdate 已移动到 org.hibernate.search.mapper.pojo.automaticindexing.ReindexOnUpdate

    • org.hibernate.search.engine.search.dsl.predicate 已移动到 org.hibernate.search.engine.search.predicate.dsl

    • org.hibernate.search.engine.search.dsl.sort 已移动到 org.hibernate.search.engine.search.sort.dsl

    • org.hibernate.search.engine.search.dsl.projection 已移动到 org.hibernate.search.engine.search.projection.dsl

    • org.hibernate.search.engine.search.dsl.aggregation 已移动到 org.hibernate.search.engine.search.aggregation.dsl

    • org.hibernate.search.backend.elasticsearch.search.dsl.predicate 已移动到 org.hibernate.search.backend.elasticsearch.search.predicate.dsl

    • org.hibernate.search.backend.elasticsearch.search.dsl.sort 已移动到 org.hibernate.search.backend.elasticsearch.search.sort.dsl

    • org.hibernate.search.backend.elasticsearch.search.dsl.projection 已移动到 org.hibernate.search.backend.elasticsearch.search.projection.dsl

    • org.hibernate.search.backend.elasticsearch.search.dsl.aggregation 已移动到 org.hibernate.search.backend.elasticsearch.search.aggregation.dsl

    • org.hibernate.search.backend.lucene.search.dsl.predicate 已移动到 org.hibernate.search.backend.lucene.search.predicate.dsl

    • org.hibernate.search.backend.lucene.search.dsl.sort 已移动到 org.hibernate.search.backend.lucene.search.sort.dsl

    • org.hibernate.search.backend.lucene.search.dsl.projection 已移动到 org.hibernate.search.backend.lucene.search.projection.dsl

    • org.hibernate.search.backend.lucene.search.dsl.aggregation 已移动到 org.hibernate.search.backend.lucene.search.aggregation.dsl

    • org.hibernate.search.engine.search.SearchPredicate 已移动到 org.hibernate.search.engine.search.predicate.SearchPredicate

    • org.hibernate.search.engine.search.SearchSort 已移动到 org.hibernate.search.engine.search.sort.SearchSort

    • org.hibernate.search.engine.search.SearchProjection 已移动到 org.hibernate.search.engine.search.projection.SearchProjection

    • org.hibernate.search.engine.search.DocumentReference 已移动到 org.hibernate.search.engine.backend.common.DocumentReference

  • HSEARCH-3441:DSL 方法现在使用一致的措辞。

    • 在程序映射 API 中

      • withExtractor() 已重命名为 extractor()

      • withExtractors() 已重命名为 extractors()

      • withoutExtractors() 已重命名为 noExtractors()

    • 在谓词 DSL 中

      • onField()/orField()/onFields()/orFields() 已弃用。请使用无前缀的版本(例如,onField()field())。

      • withConstantScore() 已弃用:请使用 constantScore()

      • boostedTo() 已弃用:请使用 boost()

      • withAndAsDefaultOperator() 已弃用:请使用 defaultOperator(BooleanOperator)

      • withSlop() 已弃用:请使用 slop()

    • 在排序 DSL 中

      • by 为前缀的方法已弃用。请使用无前缀的版本(例如,byField()field())。

      • onMissingValue() 已弃用:请使用 missing()

      • sortLast() 已弃用:请使用 last()

      • sortFirst() 已弃用:请使用 first()

  • HSEARCH-859:一些配置属性已更改,以提高一致性。

    • 仅更改名称的配置属性

      • hibernate.search.backends.myBackend.analysis_configurerhibernate.search.backends.myBackend.analysis.configurer

      • hibernate.search.backends.myBackend.multi_tenancy_strategyhibernate.search.backends.myBackend.multi_tenancy.strategy

      • hibernate.search.mapping_configurerhibernate.search.mapping.configurer

      • hibernate.search.enable_annotation_mappinghibernate.search.mapping.process_annotations

      • hibernate.search.autoregister_listenershibernate.search.enable

    • hibernate.search.enable_configuration_property_tracking 已重命名为 hibernate.search.configuration_property_checking.strategy,预期值也发生了变化:默认为 warn,使用 ignore 禁用检查。

    • 配置属性的枚举已移动到适当的包中。

    • *Settings 类中列出的属性键现在在相关的地方包括 hibernate.search. 前缀。使用 *Settings.Radicals 为无前缀的属性键。

其他改进和错误修复

  • HSEARCH-3667:Hibernate Search 6 现在在启用 Hibernate Envers 时可以正确工作:它可以正确启动并能索引版本化实体的最新版本。感谢 Damien Clement d’Huart 报告此问题并提供修复。

  • HSEARCH-2254:嵌套字段内的单值排序现在可以正确工作。

  • HSEARCH-3715:在批量索引时,再次可以设置自定义监控器。

  • HSEARCH-3670java.util.Date 属性持有 java.sql.Date 值现在可以正确索引。

  • HSEARCH-3690:现在正确支持类型为字符串的实体标识符。

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

如何获取此版本

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

反馈、问题、想法?

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


返回顶部