Hibernate Search

从 Hibernate Search 4.x 迁移到 5.0

升级到 Hibernate Search 5.0.0.Final

本指南旨在帮助您将基于较新版本 Hibernate Search 4(例如 *4.4.x* 和 *4.5.x*)的现有应用程序迁移到 Hibernate Search 5。

如果您要从旧版本升级,请先迁移到 *4.5.3.Final*。
本文档提供了迁移的指针。它指的是 Hibernate Search 5.0.0.Final。如果您认为缺少某些内容或某些内容不起作用,请 联系我们。如果您要迁移不同的版本,请参阅 Hibernate Search 迁移指南

要求

最重要的是,Hibernate Search 5 现在需要 Java 7。对 Java 6 的支持已取消。

Hibernate Search 5 现在还构建在 Lucene 4 之上(更准确地说,是 4.10.2)。如果您使用任何本机 Lucene API,请确保与该版本保持一致。另请参阅 Lucene 迁移指南

Hibernate Search 与 Hibernate ORM 4.3.7.Final 和 Infinispan 7.0.2.Final 兼容。

API 更改

虽然 Lucene API 在版本 3 和 4 之间发生了很大变化,但我们能够将大部分复杂性隐藏在 Hibernate Search API 后面。但是,某些更改会一直向下传递。

排序查询结果

Lucene 的 SortField API 已更改。而不是

fulltextQuery.setSort( new Sort( new SortField( "title", SortField.STRING ) ) );

您现在需要使用

fulltextQuery.setSort( new Sort( new SortField( "title", SortField.Type.STRING ) ) );

类重命名和重新定位

在 Hibernate Search 4 和 5 之间,几个类已更改名称或包。这发生在 Search API 内部以及 Lucene API 内部。以下是最重要的更改列表。

  • SearchFactory 已从模块 hibernate-search-engine 迁移到 hibernate-search-orm,因为它应该只被 ORM 集成使用。其他集成应该只依赖于 SearchIntegrator(之前的 SearchFactoryIntegrator

  • 以下类已迁移

    • org.hibernate.search.engine.impl.SearchMappingBuilder
      org.hibernate.search.engine.spi.SearchMappingBuilder

    • org.hibernate.search.Environment
      org.hibernate.search.cfg.Environment

    • org.hibernate.search.FullTextFilter
      org.hibernate.search.filter.FullTextFilter

    • org.hibernate.search.indexes.impl.DirectoryBasedIndexManager
      org.hibernate.search.indexes.spi.DirectoryBasedIndexManager

    • org.hibernate.search.infinispan.impl.InfinispanDirectoryProvider
      org.hibernate.search.infinispan.spi.InfinispanDirectoryProvider

    • org.hibernate.search.ProjectionConstants
      org.hibernate.search.engine.ProjectionConstants

    • org.hibernate.search.SearchException
      org.hibernate.search.exception.SearchException

    • org.hibernate.search.spi.MassIndexerFactory
      org.hibernate.search.batchindexing.spi.MassIndexerFactory

    • org.hibernate.search.spi.SearchFactoryBuilder
      org.hibernate.search.spi.SearchIntegratorBuilder

    • org.hibernate.search.spi.SearchFactoryIntegrator
      org.hibernate.search.spi.SearchIntegrator

    • org.hibernate.search.Version
      org.hibernate.search.engine.Version

  • 枚举值 SpatialMode.GRID 已重命名为 SpatialMode.HASH

在 Apache Lucene 中

  • Lucene 的 QueryParser 包已从 org.apache.lucene.queryParser.QueryParser 更改为 org.apache.lucene.queryparser.classic.QueryParser

  • 许多流行的 AnalyzerTokenFilterCharFilter 类已移动。请参阅 Lucene API 文档 以查找相应的替换项。

  • Solr 实用程序类(例如 TokenizerFactoryTokenFilterFactory)已移至 Apache Lucene。因此,我们可以删除对 Apache Solr 的依赖关系。好消息是依赖关系图简化了!坏消息是,如果您依赖于这些实用程序或自定义分析器,您需要找到新的(包)名称。

映射

嵌入式关系的 ID 字段默认不再被索引

当使用 @IndexedEmbedded 注释包含来自相关实体的字段时,我们会包含相关实体的“id”。这些“id”字段默认不再包含,但您可以使用 @IndexedEmbedded 注释的 includeEmbeddedObjectId 属性启用包含。

@IndexedEmbedded(includeEmbeddedObjectId=true)

数字和日期索引格式

数字和日期现在默认索引为数字字段。

类型为 DateCalendar 以及 intlongfloatdouble 及其相应包装类的属性不再索引为字符串。相反,它们现在使用 Lucene 的适当数字编码进行索引。

“id”字段是此规则的例外:即使这些字段由数字类型表示,它们默认仍将索引为字符串关键字。

DateCalendar 实例被编码为 long 值,表示自 *1970 年 1 月 1 日 00:00:00 GMT* 以来的毫秒数。
@NumericField 的使用现在已过时,除非您要为数字编码指定自定义精度。

您仍然可以通过显式指定字符串编码字段桥来保留旧的(基于字符串)索引格式。例如,对于整数,org.hibernate.search.bridge.builtin.IntegerBridge。检查包 org.hibernate.search.bridge.builtin 以获取其他公开可用的字段桥。

对于日期和日历,您可以通过新的 EncodingType 枚举来切换索引格式,例如 @DateBridge(encoding=EncodingType.STRING) 以及 @CalendarBridge(encoding=EncodingType.STRING)

数字和日期编码的更改可能是最重要的用户界面变化。如果您有任何针对以前字符串编码的字段但未按数字编码的查询,您需要更新查询。数字字段必须使用 NumericRangeQuery 搜索(如果您使用的是 Search 查询 DSL,则应为您创建正确的查询)。此外,请确保所有由分面目标定位的字段目前都需要进行字符串编码。

其他

FullTextIndexEventListener 现在为 final

FullTextIndexEventListener 现在是一个 final 类。如果您要扩展此类,则需要找到其他方法来实现您的目标。也许您可以使用 EntityIndexingInterceptor?如果您无法找到实现用例的方法 - 联系我们

hibernate-search-analyzers 模块已删除

模块 hibernate-search-analyzers 已从存储库中删除,并将不再包含在即将发布的版本中。它已过时,我们建议直接依赖于相应的 Lucene 工件,例如 org.apache.lucene:lucene-analyzers-common

JMS 控制器 API 已更改

JMS 后端依赖于 Hibernate ORM。此依赖关系已删除,因此后端也可以在其他(非 ORM)环境中使用。结果是,org.hibernate.search.backend.impl.jms.AbstractJMSHibernateSearchController 的实现者需要调整新的签名。此类实际上被认为是内部类。我们建议将此类作为示例,而不是扩展它。

ServiceRegistry API 已更新

org.hibernate.search.engine.service.spi.Service SPI 已重构。如果您要与旧的服务契约集成,请参阅 ServiceManagerServiceStartableStoppable 的 javadoc,了解有关新契约的详细信息。

返回顶部