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

我们刚刚发布了Hibernate Search 6.0.0.Alpha1,这是Hibernate Search下一个主要版本的第一个发布版本。

由于其局限性和API仍不稳定,此版本不适用于生产。然而,这是一个了解Hibernate Search未来走向并给我们反馈的好方法。

入门指南

如果您想立即开始,参考文档中的入门指南是一个很好的起点。

新功能

有关自上次发布以来的全部更改列表,请参阅发布说明。但请注意:其中有很多内容。您可能觉得下面的摘要更容易处理。

预览状态

Hibernate Search 6.0目前是一个技术预览,尚未准备好用于生产。

尽管Hibernate Search 6的核心功能已经存在,但仍存在许多局限性

  • 功能部分实现或缺失。例如,您还不能索引Double属性,您不能配置自定义Lucene目录,您不能在谓词DSL中忽略桥接,等等。

  • API尚未被视为稳定。

  • Hibernate Search 5中提高其效率的低级别部分尚未迁移到Hibernate Search 6。这导致明显的性能瓶颈,例如,来自多线程应用的所有索引工作都一个接一个地执行,没有任何批处理形式。

目前实现并预期可以工作的确切功能将在发布新的Alpha版本时添加到参考文档中,但总的来说,以下是你可以开始尝试的内容

  • ORM集成

    • 使用注解映射或程序化映射来映射实体。然而,我们还没有提供在Search 5中可用的所有选项(尚不支持所有数据类型)。

    • ORM实体在事务中持久化时会自动索引(如果Hibernate Search在类路径中,并且实体已映射,则自动启用)。

    • 使用Hibernate Search索引搜索ORM实体,并将管理实体作为结果检索。然而,我们还没有提供关于如何检索和初始化实体的许多选项(尚不支持)。

    • 自定义、用户定义的类型桥接、属性桥接或值桥接。然而,从POJO检索信息的API目前相当繁琐:我们知道这一点,并将致力于更轻量级的API(请参阅HSEARCH-3297HSEARCH-3298)。

  • 搜索DSL

    • org.hibernate.search.engine.search.dsl.predicate.SearchPredicateFactoryContext中列出的所有谓词。然而,我们还没有提供在Search 5中可用的所有选项(尚不支持)。

    • org.hibernate.search.engine.search.dsl.sort.SearchSortContainerContext中列出的所有排序。然而,我们还没有提供在Search 5中可用的所有选项(尚不支持)。

    • org.hibernate.search.engine.search.dsl.projection.SearchProjectionFactoryContext中列出的所有投影。然而,我们还没有提供在Search 5中可用的所有选项(尚不支持)。

ORM版本

由于Hibernate Search 6需要ORM 6(仍在开发中)中尚未实现的功能,因此目前仍然依赖于ORM 5.3。

Lucene 7

Lucene后端现在使用Lucene 7.5。

Elasticsearch 6

后端Elasticsearch现在与Elasticsearch 5.6或6.5一起工作。已取消对旧版本Elasticsearch的支持。

API刷新

由于多个原因,许多API已经更改。

不再在Hibernate Search API中使用Lucene

Hibernate Search API现在抽象于Lucene API,这样就可以使用Elasticsearch等替代后端,而无需在类路径上具有Lucene。

这也应该使我们能够更轻松地升级Lucene版本:在Search 5中,由于Lucene是“我们API的一部分”,因此当我们想要升级到新版本的Lucene时,受到的限制很大,因为Lucene的任何破坏性更改都可能意味着我们用户的破坏性更改。现在,由于使用Lucene API不再必要来使用Hibernate Search,升级应该更快。

新的搜索DSL

搜索DSL全新,具有多项改进

  • 即使查询复杂,也能使用lambdas来定义更简洁的查询。

  • 由于全新的投影DSL,可以进行类型安全的投影。

  • 在由DSL创建的谓词中注入原生谓词(org.apache.lucene.search.Query,Elasticsearch的JSON)。这对于Lucene集成来说并不新鲜,但对于Elasticsearch集成来说却是新的。请参阅org.hibernate.search.engine.search.dsl.predicate.SearchPredicateFactoryContext.extension(SearchPredicateFactoryContextExtension<T>)org.hibernate.search.backend.elasticsearch.ElasticsearchExtension.get()org.hibernate.search.backend.lucene.LuceneExtension.get()

以下是一个在Search 6中运行搜索查询的示例

FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager( entityManager );

FullTextQuery<Book> query = fullTextEntityManager.search( Book.class ).query()
        .asEntity()
        .predicate( factory -> factory.match()
                .onFields( "title", "authors.name" )
                .matching( "Refactoring: Improving the Design of Existing Code" )
                .toPredicate()
        )
        .build();

List<Book> result = query.getResultList();

并且对自定义Bean的投影如下所示

FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager( entityManager );

FullTextSearchTarget<Book> target = fullTextEntityManager.search( Book.class );

FullTextQuery<MyProjectionBean> query = target.query()
        .asProjection(
                searchTarget.projection().composite(
                        MyProjectionBean::new,
                        searchTarget.projection().field( "id_stored", Long.class ).toProjection(),
                        searchTarget.projection().field( "title", String.class ).toProjection()
                ).toProjection()
        )
        .predicate( factory -> factory.match()
                .onFields( "title", "authors.name" )
                .matching( "Refactoring: Improving the Design of Existing Code" )
                .toPredicate()
        )
        .build();

List<MyProjectionBean> result = query.getResultList();

桥接2.0

由于API刷新,桥接API必须更改,所以我们抓住这个机会彻底重写了桥接API,使桥接更强大。

新的Bridge API完全不同,但有很多改进

  • 自定义(用户定义)桥接注解,允许传递类型安全的参数,而不仅仅是字符串。

  • 通过允许桥接声明它们使用的实体部分,更好地支持桥接中的脏检查优化(特别是在TypeBridge中)。

  • 在非String字段上的谓词将无需绕过桥接(如Search 5中的.ignoreFieldBridge())即可工作。

  • 还有更多!

更易用的自动索引

自动索引的改进不仅限于桥接:在Search 6中,@IndexedEmbedded的配置也更加简单。

更精确地说,对索引嵌入式实体的更改将自动触发"嵌入"实体的重新索引,并且在大多数情况下,不再需要用@ContainedIn注解关联的逆向侧。当无法解析关联的逆向侧时,将报告映射错误。

运行时连接

Hibernate Search 6.0引入了类似于Elasticsearch中同名功能的"嵌套"字段和谓词。

请参阅org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexedEmbedded.storageorg.hibernate.search.engine.search.dsl.predicate.SearchPredicateFactoryContext.nested()

从Search 5迁移

如上所述,Search 6破坏了许多API,因此迁移旧项目的工作将比以往更多。随着新版本的发布和API的日益稳定,迁移指南https://hibernate.com.cn/search/documentation/migrate/6.0/将完成,但现在我们只建议在小型项目中测试Search 6。

最终,我们打算提供额外的"兼容性"模块,允许您在Search 6底层使用Search 5 API。然而,我们的目标不是完全向后兼容:对于一些变化很大的功能,可能无法再使用Search 5 API。此兼容层的首要目的是分散迁移工作量:您将不得不立即更改Maven依赖关系、配置以及更复杂的映射/查询,但您可以将迁移工作的更重复部分(简单查询、简单实体映射)推迟到以后。

最后,对于那些无法或不想花费时间进行迁移的人,我们打算继续维护Hibernate Search 5.x的维护版本(即错误修复):目前尚未设定结束日期。

如何获取此版本

所有详细信息均可在https://hibernate.com.cn/search/releases/6.0/#get-it的hibernate.org专用页面上找到,并且是最新的。

请注意,如果您想尝试Hibernate Search 6,参考文档中包含的https://docs.jboss.com.cn/hibernate/search/6.0/reference/en-US/html_single/#getting-started入门指南是一个很好的起点。

反馈、问题、想法?

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


回到顶部