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

我们刚刚发布了Hibernate Search 6的第一个稳定版本:版本6.0.0.Final。

在20个alpha和beta版本的过程中,我们解决了900多个问题,Hibernate Search 6真的是一个重大版本,并且这一点很明显。

最明显的变化是:经过改进的API,更适合与Elasticsearch协同工作(但仍然可以完美地与嵌入式Lucene协同工作),以及从Lucene 5升级到8和从Elasticsearch 5.6升级到7。

但这并没有结束:更安全、更简洁的Search DSL、更简单的映射、更强大的桥梁、更智能的自动索引、嵌套文档……

开始使用Hibernate Search 6

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

如果您想迁移基于Hibernate Search 5的应用程序,请注意Hibernate Search 6 API与Hibernate Search 5有显著差异。我们建议您查看迁移指南

与Hibernate Search 5相比的新特性

依赖项升级

Hibernate ORM

Hibernate Search 6依赖于Hibernate ORM 5.4。

请注意,只有 Hibernate ORM 5.4.4.Final 或更高版本才能正确工作;5.4.3.Final 及更早版本将无法正常工作。

Lucene 8

Lucene 后端现在使用 Lucene 8.7。

Elasticsearch 7

Elasticsearch 后端现在与 Elasticsearch 5.6、6.8 或 7.10 兼容。已删除对旧版本 Elasticsearch 的支持。

API 重构

这可能是 Hibernate Search 6 最重要的一点:大多数 API 都已更改。我们并非轻率地做出这个决定,也不打算在不久的将来再次这么做:在这个阶段,为了使 Hibernate Search 继续改进,破坏 API 是必要的。

这次重构的主要目标是抽象化 Lucene API,以便 Elasticsearch 后端可以成为一等公民,实现时无需任何黑客手段或不必要的依赖。

不言而喻,但 Lucene 后端的重要性将一如既往。实际上,抽象化 Lucene API 对 Lucene 后端也有好处:它将使 Hibernate Search 项目能够在新版本发布后立即升级 Lucene。

重构的另一个好处是:既然 API 必须更改,我们就借此机会实施了长期未完成的改进,这些改进也要求更改 API。请参阅以下部分以了解更多关于这些改进的信息。

更安全、更简洁、后端无关的 Search DSL

Search DSL 是全新的,具有几个改进

更安全
  • 搜索命中现在有类型,即使在投影时也是如此,这得益于全新的 投影 DSL

  • 对于数值谓词(例如基于 intlongdouble 的)的实现现在是从目标字段的类型确定的,而不是从参数的类型确定。当传递错误类型的参数时,这更安全:Hibernate Search 5 会生成一个不匹配任何内容的谓词,而 Hibernate Search 6 会检测类型不匹配并抛出异常。

更简洁
  • 可以使用 lambdas 来更简洁地定义查询,即使查询很复杂

  • 在单一查询中针对多个类型时,谓词的语法更简单:不再需要实例化多个 QueryBuilders,Hibernate Search 会考虑多个类型被目标,并自动检查目标字段是否在所有目标索引中兼容。

更一致
  • API 类型始终使用 Search 前缀:不再混用 FullTextSearch 或没有前缀。

  • 现在 SearchQuery 类型(之前为 FullTextQuery)现在定义了自己的方法,而不是扩展 JPA 的 TypeQuery,这突出了它针对索引而不是数据库的事实,并使其成为一个更友好的 API。在必要时,仍然可以 检索一个实现 JPA 的 TypeQuery 的适配器。

默认为后端无关,但有后端特定的扩展
更多功能

更易用的映射

专门的@*Field注解

Hibernate Search 6提供了针对每种主要字段类型的单独的@*Field注解:大多数情况下,@GenericField即可,但您可以通过@FullTextField@KeywordField等访问更多选项(分析,……)。

这样,每个注解只提供所选字段类型有意义的选择,而没有其他选择。您不会再不小心禁用数字字段的索引分析!

容器类型映射更简单
  • @*Field注解可以直接应用于List<String>OptionalInt,以便索引“包含”的元素,这归功于容器提取器

  • 对于更复杂的类型(例如Map<String, Integer>),可以显式选择容器提取器

更多功能
  • 能够定义一个searchAnalyzer,以分析搜索查询与索引文本不同(特别是对于自动完成很有用)。

  • 能够使用@ScaledNumberField映射可缩放数字(BigDecimal/BigInteger)。

更强大、后端无关的桥接器

新的桥接API不同且大幅改进。

对字段定义的完全控制
  • 桥接器可以精确声明字段类型,特别是可以挑选分析器或在桥接器声明的字段上启用聚合(分面)。

  • 针对非String字段的桥接器现在是第一类公民:当在Search DSL中针对桥接器声明的非String字段时,您将不再需要像Search 5中那样绕过桥接器(.ignoreFieldBridge())。

  • 桥接器可以声明具有精确类型的动态字段,Search DSL将了解这些字段。

对自动重新索引的完全控制

桥接器可以声明它们依赖的属性,使Hibernate Search能够更频繁地重新索引。

自定义桥接器注解

可以使用自定义注解应用桥接器,允许更清晰的映射,特别是在桥接器参数化时。

有关桥接器的更多信息,请参阅本节文档

后端无关
  • 字段声明默认不涉及任何Lucene API。

  • 然而,在必要时,桥接器仍然可以声明原生字段,无论是使用Lucene还是Elasticsearch

易于配置,更智能的自动索引

自动解决重新索引需求
  • @ContainedIn不再需要:当在关联上使用@IndexedEmbedded时,Hibernate Search 6会从Hibernate ORM元数据推断关联的逆向方面,这使得它可以在关联的目标更改时自动重新索引带有@IndexedEmbedded注释的类。

  • 当无法解决关联的逆向方面时,Hibernate Search 6将在引导时报告映射错误,让您能够提前检测索引不同步的风险。

轻松覆盖重新索引需求
轻松配置索引同步

有些人希望使用异步自动索引获得更多性能,而其他人更喜欢使用同步自动索引来保证数据安全和索引文档的即时可见性。在Hibernate Search 6中,所有这些都可以通过一个单配置属性进行配置。

更智能的变更处理

Hibernate Search 6在处理复杂实体图上的变更时更加智能。

当一个实体中的属性发生变化,该实体被多个其他实体索引嵌入时,Hibernate Search 6将仅根据@IndexedEmbedded(includePaths = …​)和其他元数据遍历受变更实际影响的实体关联。

更灵活的架构管理

在启动时管理架构

与Hibernate Search 5一样,Hibernate Search 6可以在启动时为您管理架构。或者不这样做:如果这会妨碍,则可以禁用。

按需管理架构

与Hibernate Search 5不同,Hibernate Search 6提供了专门的API来按需触发架构操作

在大量索引时管理架构

大量索引器可以自动删除并重新创建架构:您只需调用.dropAndCreateSchemaOnStart(true)。与Elasticsearch后端相比,这可以显著快于从现有架构中删除所有文档。

与嵌套文档的运行时连接

Hibernate Search 6.0引入了类似于Elasticsearch同名功能的“嵌套”字段谓词

这意味着特别是索引嵌入实体可以搜索得更细致,例如搜索那个作者名字为给定名字,姓氏为给定姓氏的特定书籍。通过适当的映射和查询,Hibernate Search不再会在您搜索“John Doe”时返回由“John Smith”和“Jane Doe”共同撰写的书籍!

有关详细信息,请参阅参考文档中的将嵌入元素结构化为嵌套文档

更多内容

  • 对传统JPA批量处理的支持更好,包括定期的刷新/清除:Hibernate Search 6将对在flush()时索引的文档进行缓冲,以避免Hibernate Search 5会引发的令人头疼的LazyInitializationException

  • 在引导过程中更好地报告错误:Hibernate Search将为每个错误提供更多上下文,并在停止之前尽可能收集尽可能多的错误。

有关自Hibernate Search 6.0.0.CR2以来的全部变更列表,请参阅发行说明

有关自Hibernate Search 5.11以来的全部变更列表,请参阅这里

如何获取此版本

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

反馈、问题、想法?

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


回到顶部