我们刚刚发布了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-3297,HSEARCH-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中可用的所有选项(尚不支持)。
-
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();
从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
入门指南是一个很好的起点。