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

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

除了几个错误修复之外,此版本主要引入了映射器级别的模式管理配置和 API、多值字段的排序、更简单和可配置的索引队列、隐式嵌套谓词以及 Elasticsearch 的离线启动。还包括对 Lucene 8.5、Elasticsearch 7.6.1 和 Hibernate ORM 5.4.13.Final 的升级。

开始使用 Hibernate Search 6

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

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

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

新功能

模式管理配置和 API

HSEARCH-3759HSEARCH-3751 中,为了应对更多用例,我们对模式管理进行了重大改进。

现在,通过配置属性 hibernate.search.schema_management.strategy,在映射器级别配置了一种更简单的管理索引/模式的方法,该方法在启动时隐式地通过预配置的策略进行管理。有几种策略可供选择:nonecreatevalidatecreate-or-validate 等。有关更多信息,请参阅 自动模式管理

自动模式管理策略现在默认为 create-or-validate。它会创建缺失的索引并验证现有的索引,而不是之前的默认策略,该策略会忽略现有的索引,有时会导致疏忽,一些用户在更改Hibernate Search映射后忘记更新模式。

新的方法是显式管理索引/模式,启动后随时可以进行。这涉及到从Hibernate Search获取一个 SearchSchemaManager,然后调用其方法来按需创建、验证或删除模式。

SearchSchemaManager manager = Search.mapping( sessionFactory )
        .scope( MyEntity.class ) // Use `Object.class` to target all indexed entity types
        .schemaManager();
manager.dropAndCreate();
// Starting here, the freshly created indexes can be used

有关更多信息,请参阅 模式管理手册

最后,在重新索引时,可以通过在 MassIndexer 上设置新的 dropAndCreateSchemaOnStart(boolean) 选项来简单地删除和重新创建索引和模式。有关更多信息,请参阅 MassIndexer参数

Elasticsearch后端离线启动

多亏了Alexis Cucumel(《HSEARCH-3841》)的努力,现在可以在完全离线模式下启动Hibernate Search。

为此

  • 使用属性 hibernate.search.backends.<backend name>.version 配置Elasticsearch集群的预期版本,并使用属性 hibernate.search.backends.<backend name>.version_check.enabled 禁用启动时的版本检查。

  • 将属性 hibernate.search.schema_management.strategy 设置为 none 以禁用启动时的自动模式管理。

  • 如有必要,在您的应用程序中添加显式模式管理代码,在您知道Elasticsearch集群已启动和运行时触发。

多值字段的排序

HSEARCH-3103以来,Hibernate Search现在能够对多值字段进行排序。默认情况下,将选择每个文档的最小值进行升序排序,最大值进行降序排序。

可以使用排序DSL中的新 mode(SortMode) 方法来告诉Hibernate Search如何选择排序值。

List<Author> hits = searchSession.search( Author.class )
    .where( f -> f.matchAll() )
    .sort( f -> f.field( "books.pageCount" ).mode( SortMode.AVG ) )
    .fetchHits( 20 );

有关更多信息,请参阅此部分文档

感谢Waldemar Kłaczyński对实现所做的贡献。

隐式嵌套谓词

到目前为止,使用对象字段的“嵌套”存储意味着你必须用nested谓词包装访问其子字段的每个谓词,即使只有一个谓词也是如此。

HSEARCH-3752以来,Hibernate Search为你做了这件事:现在默认添加嵌套谓词,除非明确提及。

这意味着这个查询

List<Book> hits = searchSession.search( Book.class )
    .where( f -> f.nested().objectField( "authors" )
        .nest( f.match().field( "authors.lastName" )
            .matching( "asimov" ) )
    .fetchHits( 20 );

...现在可以简单地写成这样(以前不会匹配任何内容)

List<Book> hits = searchSession.search( Book.class )
    .where( f -> f.match().field( "authors.lastName" )
            .matching( "asimov" ) )
    .fetchHits( 20 );

如果你实际上需要一个在同一嵌套对象上有多个谓词的条件,你仍然需要用nested谓词包装谓词。所以这个搜索查询不会改变

List<Book> hits = searchSession.search( Book.class )
    .where( f -> f.nested().objectField( "authors" )
        .nest( f.bool()
            .must( f.match().field( "authors.firstName" )
                .matching( "isaac" ) )
            .must( f.match().field( "authors.lastName" )
                .matching( "asimov" ) )
        ) )
    .fetchHits( 20 );

简单查询字符串中的标志

多亏了Waldemar Kłaczyński(《HSEARCH-3847》)的努力,现在可以配置简单查询字符串谓词以启用或禁用所需的语法功能。

List<Book> hits = searchSession.search( Book.class )
    .where( f -> f.simpleQueryString().field( "title" )
         .matching( "I want a **robot**" )
         .flags( SimpleQueryFlag.AND, SimpleQueryFlag.OR, SimpleQueryFlag.NOT ) )
    .fetchHits( 20 );

更简单、可配置的索引队列

Hibernate Search中的索引涉及将操作推送到队列,并在后台线程中执行这些操作。

HSEARCH-3575中,引入了关于后台线程(LuceneElasticsearch)和队列(LuceneElasticsearch)的几个新配置选项。

HSEARCH-3822HSEARCH-3872中,我们对索引操作编排进行了几个改进,特别是允许单个索引的并行索引,并通常简化了代码。

最后,为了最大限度地利用并行索引,在HSEARCH-3871中,我们将Lucene后端提交的默认配置切换了:在大量索引时,现在每秒提交一次,而不是之前每大约1000个文档提交一次的行为。

版本升级

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

不兼容的变更

  • Lucene后端可排序字段的内部docvalues格式已更改。如果您的索引包含可排序字段,则需要重新索引。

  • 与Elasticsearch索引生命周期管理相关的配置属性已更改

    • 配置属性lifecycle.strategy已被删除,如果使用它,则启动时会触发异常。有关启动时的自动模式管理,请参阅映射级别的新schema_management选项(新选项)

    • 配置属性lifecycle.minimal_required_status已重命名为schema_management.minimal_required_status

    • 配置属性lifecycle.minimal_required_status_wait_timeout已重命名为schema_management.minimal_required_status_wait_timeout

文档

Sort DSL中的更多功能现在已记录在案

其他改进和错误修复

  • HSEARCH-3796@IndexedEmbedded现在可以多次应用于相同的getter/field。您只需要不同的prefix

  • HSEARCH-3850:现在有一个新工具可用于在配置Hibernate Search时构建属性键。有关更多信息,请参阅文档中的此部分

  • HSEARCH-3844:在Lucene后端使用简单查询字符串谓词对非分析的、非归一化的字段进行查询时不再触发NullPointerException。感谢Waldemar Kłaczyński报告此问题。

  • HSEARCH-3845:由简单查询字符串谓词在Lucene后端生成的前缀查询不再跳过输入文本的归一化。感谢Waldemar Kłaczyński报告并修复此问题。

  • HSEARCH-3851/HSEARCH-3852:已解决与索引失败报告相关的多个问题。

  • HSEARCH-3857:在索引具有@IndexEmbedded依赖关系的多个实体时,在非常特定的场景中会抛出ConcurrentModificationException;已修复。感谢Alexis Cucumel报告并修复此问题。

  • HSEARCH-3859:在Lucene后端基于double/float字段的.desc().missing().last() / .asc().missing().first()不再将文档放置在0周围,而是按预期放置在最后/最前。

  • HSEARCH-3861:Elasticsearch 搜索查询不再在没有显式投影定义的情况下无谓地获取整个文档源。

  • HSEARCH-3869:Elasticsearch 批处理操作失败不再导致 IndexOutOfBoundsException

  • HSEARCH-3874:在实体上应用 @IdClass(即使不是 @Indexed),在启动 Hibernate Search 时不再导致 NullPointerException

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

如何获取此版本

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

反馈、问题、想法?

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


返回顶部