5.9. Hibernate 搜索更改
JBoss EAP 7 附带的 Hibernate Search 版本已更改。之前的 JBoss EAP 版本随 Hibernate Search 4.6.x 一同发布。JBoss EAP 7 附带 Hibernate Search 5.5.x。
Hibernate Search 5.5 基于 Apache Lucene 5.3.1 构建。如果您使用任何原生 Lucene API,请确保与此版本一致。Hibernate Search 5.5 API 换行并隐藏了版本 3 和版本 5 之间进行的许多 Lucene API 更改的复杂性,但一些类现已弃用、重命名或重新打包。本节介绍了这些更改如何影响应用程序代码。
Hibernate 搜索映射更改
为嵌入式关系的 ID 字段索引
当使用 @IndexedE mbedededed 注解包含相关实体中的字段时,不再包含相关实体的 id。您可以使用 @IndexedEmbeded 注解的 includeEmbeded ObjectId 属性启用包括 id。
示例 :@IndexedEmbeded 注解
@IndexedEmbedded(includeEmbeddedObjectId=true)
@IndexedEmbedded(includeEmbeddedObjectId=true)
数量和日期索引格式更改
现在,默认情况下,数字和日期被索引为数字字段。int、long、float、double 及其对应打包程序类的属性不再被索引为字符串。现在,它们会根据 Lucene 的适当数字编码进行索引。id 字段是此规则的一个例外。即使它们由数字类型表示,也会默认将它们索引为 string 关键字。使用 @NumericField 现已过时,除非您想为数字编码指定自定义精度。您可以通过显式指定字符串 encoding 字段桥接来保留旧的基于字符串的索引格式。如果是整数,这是 org.hibernate.search.bridge.builtin.IntegerBridge。检查 org.hibernate.search.bridge.builtin 软件包,用于其他公开可用的字段网桥。
Date 和 Calendar 不再被索引为字符串。相反,实例会用长值编码,代表自 1970 年 1 月 1 日 00:00:00 GMT 后的毫秒数。您可以使用新的 EncodingType enum 切换索引格式。例如:
示例:@DateBridge 和 @CalendarBridge 注释
@DateBridge(encoding=EncodingType.STRING) @CalendarBridge(encoding=EncodingType.STRING)
@DateBridge(encoding=EncodingType.STRING)
@CalendarBridge(encoding=EncodingType.STRING)
数字和日期的编码更改非常重要,对应用程序的行为有重大影响。如果您有一个以字符串编码的字段为目标的查询,但现在采用数字编码,则必须更新查询。必须使用 NumericRangeQuery 搜索数字字段。您还必须确保通过面对面目标的所有字段都是字符串编码。如果您使用 Search 查询 DSL,则会自动为您创建正确的查询。
其它 Hibernate 搜索更改
-
对选项进行排序已被改进,字段编码在排序选项中现在会导致运行时异常。如果排序中使用的字段已知,Lucene 还提供更多执行性排序。Hibernate Search 5.5 提供新的
@SortableField注释,及其多值 companion@SortableFields。如需更多信息,请参阅从 Hibernate Search 5.4 迁移到 5.5。 Lucene
SortFieldAPI 需要以下应用程序代码更改:在之前的 JBoss EAP 版本中,您可以设置查询中的 sort 字段类型,如下所示:
fulltextQuery.setSort(new Sort(new SortField("title", SortField.STRING)));fulltextQuery.setSort(new Sort(new SortField("title", SortField.STRING)));Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下是如何在 JBoss EAP 7 中设置它的示例:
fulltextQuery.setSort(new Sort(new SortField("title", SortField.Type.STRING)));fulltextQuery.setSort(new Sort(new SortField("title", SortField.Type.STRING)));Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
由于
SearchFactory只能供 ORM 集成使用,因此它从hibernate-search-engine模块移动到hibernate-search-orm模块。其他集成商应完全依赖SearchIntegrator,它取代了过时的SearchFactoryIntegrator。 -
enum 值
SpatialMode.GRID被重命名为SpatialMode.HASH。 -
FullTextIndexEventListener现在是一个最终类。如果您目前扩展了这个课程,您必须找到一个替代的解决方案才能获得相同的功能。 -
hibernate-search-analyzers模块已被删除。推荐的方法是直接使用适当的 Lucene 工件,如org.apache.lucene:lucene-analyzers-common。 -
Jakarta Messaging 控制器 API 已更改。对 Hibernate ORM 的 Jakarta 消息传递后端依赖性已经被删除,因此可以在其他非ORM 环境中使用它。其结果是,
org.hibernate.search.backend.impl.jms.AbstractJMSHibernateSearchController的实现器必须根据新的签名进行调整。此类是一个内部类,建议将它用作示例,而不是扩展它。 -
org.hibernate.search.spi.ServiceProviderSPI 被重构。如果您与旧服务合同集成,请参阅 Hibernate Search 5.5 Javadoc Service、、startServiceable和Stoppable了解新合同的详细信息。 -
如果您保留了 Lucene 3.x 生成的索引,且已使用 Hibernate Search 5.0 或更高版本进行重建,您将得到
IndexFormatTooOldException。建议您使用大量索引器重建索引。如果您无法做到这一点,请尝试使用 Lucene 的IndexUpgrader。在更改默认行为时,您必须仔细更新 Hibernate Search 映射。如需更多信息,请参阅 Apache Lucene Migration Guide。 - 在 JBoss EAP 7 中,Apache Lucene 从 3.6 升级到 5.3。如果您的代码直接导入 Lucene 代码,请参阅 Apache Lucene Migration Guide 了解详情。还可在 Lucene Change Log 中找到其他信息。
-
使用
@Field(indexNullAs=)在索引中编码 null 标记值时,标记的类型必须与同字段中索引的所有其他值兼容。例如,之前可以对类型为数字的字段中的 null 值使用字符串"null"。这不再被允许。现在,您需要选择一个代表null的值,例如-1。 -
对面对引擎进行了显著改进。大多数更改不会影响 API。一个值得注意的例外是,您必须注解任何您要用于与
@Facet或@Facets注解相关的字段。
Hibernate 搜索重命名和重新打包类
以下是已重新打包或重命名的 Hibernate 搜索类列表:
| 以前的软件包和类 | 新的软件包和类 |
|---|---|
| org.hibernate.search.Environment | org.hibernate.search.cfg.Environment |
| org.hibernate.search.FullTextFilter | org.hibernate.search.filter.FullTextFilter |
| org.hibernate.search.ProjectionConstants | org.hibernate.search.engine.ProjectionConstants |
| org.hibernate.search.SearchException | org.hibernate.search.exception.SearchException |
| org.hibernate.search.Version | org.hibernate.search.engine.Version |
Lucene: Renamed 和 repackaged 类
查询解析器已移至新模块,结果是软件包从 org.apache.lucene.queryParser.QueryParser 变为 org.apache.lucene.queryparser.classic.QueryParser。
许多 Lucene 分析器都已重构,结果是软件包的变化。请参阅 Apache Lucene 文档 来查找替换软件包。
一些 Apache Solr 实用程序类(如 TokenizerFactory 或 TokenFilterFactory )被移到 Apache Lucene 中。如果您的应用程序使用这些实用程序或自定义分析器,则必须在 Apache Lucene 中找到新的软件包名称。
如需更多信息,请参阅 Apache Lucene 迁移指南。
Hibernate 搜索已弃用的 API
有关 Hibernate 搜索已弃用接口、类、枚举、注解类型、方法、构造器和枚举 API 文档的完整列表,请参阅 Hibernate Search Decated API 文档。
Hibernate 搜索已弃用的接口
| Interface | 描述 |
|---|---|
| org.hibernate.search.store.IndexShardingStrategy |
从 Hibernate Search 4.4 开始已弃用。可能会在搜索 5 中删除。改为使用 |
| org.hibernate.search.store.Workspace | 此接口将移动,并且应该被视为非公共 API。如需更多信息,请参阅 HSEARCH-1915。 |
Hibernate 搜索已弃用的类
| 类 | 描述 |
|---|---|
| org.hibernate.search.filter.FilterKey | 自定义过滤器键已弃用,并计划在 Hibernate Search 6 中删除。从 Hibernate Search 5.1 开始,根据给定的过滤器参数自动计算缓存 Lucene 过滤器的密钥。 |
| org.hibernate.search.filter.StandardFilterKey | 自定义过滤器键已弃用,并计划在 Hibernate Search 6 中删除。从 Hibernate Search 5.1 开始,根据给定的过滤器参数自动计算缓存 Lucene 过滤器的密钥。 |
Hibernate 搜索已弃用的 enums
| Enum | 描述 |
|---|---|
| org.hibernate.search.annotations.FieldCacheType |
删除 |
Hibernate 搜索已弃用的注解
| 注解 | 描述 |
|---|---|
| org.hibernate.search.annotations.CacheFromIndex | 移除注解。不需要替代方案。 |
| org.hibernate.search.annotations.Key | 自定义过滤器缓存键是已弃用的功能,在 Hibernate Search 6 中删除。从 Hibernate Search 5.1 开始,根据过滤器参数自动决定过滤缓存密钥,因此不再需要提供密钥对象。 |
Hibernate 搜索已弃用的方法
| 方法 | 描述 |
|---|---|
| org.hibernate.search.FullTextSharedSessionBuilder.autoClose() | 没有替换 |
| org.hibernate.search.FullTextSharedSessionBuilder.autoClose(boolean) | 没有替换 |
| org.hibernate.search.cfg.IndexedMapping.cacheFromIndex(FieldCacheType…) | 这将在没有替换的情况下删除。 |
| org.hibernate.search.cfg.EntityDescriptor.getCacheInMemory() | 这将在没有替换的情况下删除。 |
| org.hibernate.search.cfg.ContainedInMapping.numericField() |
改为调用 |
| org.hibernate.search.cfg.EntityDescriptor.setCacheInMemory(Map<String, Object>) | 这将在没有替换的情况下删除。 |
| org.hibernate.search.MassIndexer.threadsForSubsequentFetching(int) | 此方法将被删除。 |
| org.hibernate.search.query.dsl.FuzzyContext.withThreshold(float) |
使用 |
Hibernate 搜索已弃用的构造器
| Constructor | 描述 |
|---|---|
| org.hibernate.search.cfg.NumericFieldMapping(PropertyDescriptor, EntityDescriptor, SearchMapping) |
使用 |
影响高级集成商的变化
本节介绍不是公共 API 的一部分的更改。它们不应该影响平均开发人员,因为工件只能被扩展 Hibernate Search 框架的集成访问。
-
IndexWriterSetting.MAX_THREAD_STATES和IndexWriterSetting.TERM_INDEX_INTERVALenum constants 已被弃用。它们会影响从配置中读取哪些属性,因此缺少它们的事实意味着配置属性(如hibernate.search.Animals.2.indexwriter.term_index_interval = default)会被忽略。唯一的副作用是 属性没有被应用。 -
SearchFactoryIntegrator接口现已弃用。您应该立即迁移所有代码,以使用SearchIntegrator。 -
SearchFactoryBuilder类现已弃用。改为使用SearchIntegrationBuilder。 -
HSQuery.getExtendedSearchIntegrator()方法已弃用。可以使用SearchIntegrator,但最好完全删除它。 -
DocumentBuilderIndexedEntity.getFieldCacheOption()方法已弃用。没有替换。 -
BuildContext.getIndexingStrategy()方法已弃用。使用BuildContext.getIndexingMode()。 -
DirectoryHelper.getVerifiedIndexDir(String, Properties, boolean)方法已弃用。使用DirectoryHelper.getVerifiedIndexPath(java.lang.String, java.util.Properties, boolean)。 以下是已重新打包或重命名的 Hibernate 搜索类列表:
Expand 以前的软件包和类 新的软件包和类 org.hibernate.search.engine.impl.SearchMappingBuilder
org.hibernate.search.engine.spi.SearchMappingHelper
org.hibernate.search.indexes.impl.DirectoryBasedIndexManager
org.hibernate.search.indexes.spi.DirectoryBasedIndexManager
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