经过14个月的艰苦努力,欢迎 Hibernate Search 5 的到来!
让我们来看看为什么您应该急于升级的亮点
- 升级到 Lucene 4.10
- 许多内部改进,特别是性能
- 多亏了 Hibernate Search 抽象,尽管 Lucene API 发生了大量变化,但您的代码仍然可以轻松升级
- 数值属性现在默认以NumericField的形式索引
- 需要 JDK 7
- 与 Hibernate ORM 4.3 和 WildFly 8.x 兼容
- 稳定
如何获取它
您所需的一切都可以在 Hibernate Search 的 网站上找到。从这里下载 完整发行版。并且不要犹豫在我们的 论坛 上联系我们。
如果您是 Hibernate Search 的初学者,最好从我们的 入门指南 开始。
功能列表
让我们深入了解功能列表。
Lucene 4.10
Hibernate Search 4 一直停留在相当过时的 Apache Lucene 3.6.x 版本,而 Lucene 4 系列正在引入许多改进。Lucene 现已达到版本 4.10.3,被认为稳定、可靠且比先前版本效率显著更高;您现在可以享受到所有这些改进。一些 API 发生了变化,您可能需要调整一些代码,例如 Analyzer 类名称,但一般来说,如果您使用的是 Hibernate Search API,Lucene 最复杂的变化都被封装起来,不会直接影响到您的代码。
为什么是 5.0 版本
主要版本号增加是因为Lucene升级是一个重大变更,并且因为它迫使我们必须打破我们在小版本上应用的API兼容性承诺。不要假设这也会要求Hibernate ORM版本5:它仍然依赖于Hibernate ORM 4.3.x版本(与Hibernate Search 4.5相同),并且仍然与WildFly 8兼容,我们预计它也将与WildFly 9兼容。Hibernate Search 5可能与ORM版本5兼容;我们肯定会为此目标努力,但不能保证。
因此,如果您有一个使用Hibernate ORM 4.3.x和Hibernate Search 4.5.x的应用程序,升级应该很简单,因为您不需要升级ORM,只需关注Search和Lucene所需的变化即可。
索引性能
索引引擎已被重新审视,提供了极大的性能提升,同时也简化了配置:您不再需要配置多个后端工作者。
异步索引和同步索引都已重新设计。
对于异步索引后端,您现在有一个按索引的index_flush_interval属性,您可以使用它来限制数据库上提交的更新与相关索引提交之间的时间。
同步后端现在能够合并来自多个并行事务的写请求,以便在索引上提供批量写入的优点,同时仍然具有同步更新的功能。这种新模型允许具有类似于之前仅通过选择NRT后端才能实现的成绩,但不会存在不与Infinispan目录兼容等缺点。
OSGi,Apache Karaf,JBoss FUSE
项目代码和构建已被重构,以生成优秀的OSGi兼容库。我们使用Apache Karaf运行集成测试,因此我们的工件应安全用于JBoss FUSE。Lucene jar仍然有些麻烦,但如果您有任何问题,请告诉我们,我们可能能够找到解决方案。
JDK 7,8和9兼容性
Hibernate Search 5现在需要一个Java 7运行时,但我们也定期使用Java 8和Java 9的预览版进行测试。
属性转换的自动桥发现
对于定义自定义域类型的开发者,现在可以自动将给定的Java类型绑定到FieldBridge。您不需要在整个模型中复制/粘贴那些@FieldBridge注解。该功能在文档的BridgeProvider部分中有说明。例如,您可以使用它为Java 8日期/时间类型贡献缺少的转换器。
MoreLikeThis查询
使用新的MoreLikeThis查询功能,您不必针对特定字段,而是可以提供一个索引对象的实例。这种模式也称为按示例查询
,将触发匹配所有字段(或您选择的子集)的相似性查询。一个完整的示例可以在这篇之前的博客文章中看到。
删除对Apache Solr的依赖
在此版本之前,Hibernate Search依赖于Apache Lucene进行大部分工作,并依赖于Lucene的姊妹项目Apache Solr来提供更丰富的分析器集。由于Lucene项目从Solr中纳入了此功能,因此不再需要依赖于Solr工件。
模块化改进:清洁WildFly集成
支持诸如OSGi等要求,其他项目如CapeDwarf和Infinispan(但不包括对Hibernate ORM的依赖)整合Hibernate Search,Hibernate OGM项目的高级需求,我们的集成API和模块化被大量扩展和测试,导致了许多改进,你可能不会直接注意到,但会使避免与其他任何可能使用的库的依赖冲突变得容易得多,或者可以很好地集成到你的首选容器/框架中。
一个例子是我们提供的用于简化WildFly集成的模块的新结构:高度封装,并且比之前的版本有显著更少的依赖。
例如,JGroups后端可以使用你选择的JGroups版本,即使Hibernate Search也使用Infinispan(它依赖于自己的JGroups版本),也不需要匹配Infinispan的JGroups版本;这不会成为问题,JGroups甚至不会被暴露给你的应用程序,所以理论上你可以在应用程序中直接使用第三个不同的集群库版本。在实践中,你可能想要保持版本一致,但如果你有其他偏好,这不会成为问题。
数值字段
任何数值属性,包括日历和日期类型,现在默认被索引为NumericField。NumericField在执行范围查询时更高效,所以我们认为在大多数情况下你应该使用这个。当然,仍然可以显式注解属性以恢复旧的行为:这只是一个默认值的变化。
请在运行查询时记住这个变化,因为你现在需要将这些查询作为NumericField进行查询。如果你使用我们的Query builder DSL,这将透明地正确执行,但如果你使用Lucene原生API创建查询,结果将不会匹配,并且你不会收到任何警告。
迁移指南
我们通常在我们的wiki迁移指南中跟踪任何API更改;这是查找任何特定版本之间API/兼容性更改的正确位置。
对于从4.x版本跳转到5.x版本的人,我们在网站上创建了一个新的专门的迁移页面,你可以从文档页面找到。
索引迁移
从技术上讲,这个最新的Lucene版本可以读取你现有的索引,但考虑到Lucene代码的大幅版本提升,以及数值映射的变化,以及分析器随时间的变化,我们强烈建议你替换旧索引并使用MassIndexer来触发全新的重建。
接下来是什么?
我们有一些有趣的计划,但我们的优先级由反馈定义。请告诉我们你需要什么,或者即使它对你的工作非常好,我们也很高兴听到你的反馈和你是如何使用它的。你可以通过这些媒体中的任何一种与我们联系,特别是论坛应该是一个好的起点。
这是我们希望在不久的将来工作的内容
- 动态定义的模型(不是严格绑定到注解类)
- 嵌入式Lucene后端的替代方案:Apache Solr或ElasticSearch似乎是很好的候选者
- 支持新的Java 8类型
- 集成到WildFly 9
- 支持Forge
- OpenShift / Docker / Kubernetes 模板和指南
- 提升性能(总是!)
- 在Infinispan/JGroups上改进集群功能(主节点选举?)
- 充分利用新的Lucene 4功能(分面、查询时连接等)。你能提供建议吗?
这个列表很长,我可以很容易地扩展。我们真的需要您的帮助,尤其是我们的核心团队对许多提到的其他技术不太熟悉:即使您不想编写代码,但如果您愿意尝试最新的测试,那将非常棒。