5.9. Hibernate 搜索更改
JBoss EAP 7 随附的 Hibernate Search 版本已有变化。之前的 JBoss EAP 版本随附了 Hibernate Search 4.6.x。JBoss EAP 7 随附 Hibernate Search 5.5.x。
Hibernate 搜索 5.5 基于 Apache Lucene 5.3.1 构建。如果您使用任何原生 Lucene API,请务必与这个版本一致。Hibernate Search 5.5 API 打包并隐藏了版本 3 和版本 5 之间进行的许多 Lucene API 更改的复杂性;但是,一些类现已弃用、重命名或重新打包。本节论述了这些更改会如何影响应用程序代码。
Hibernate 搜索映射更改
嵌入式关系的 id 字段索引
在使用 @IndexedEmbedded 注释来包含相关实体的字段时,相关实体的 id 不再包含在内。您可以使用 @Indexed 。
Embedded 注释的 includeEmbeddedObjectId 属性来启用 id 包含
示例: @IndexedEmbedded Annotation
@IndexedEmbedded(includeEmbeddedObjectId=true)
编号和日期索引格式变化
数字和日期现在默认作为数字字段索引。int、long、float 、 ual及其 对应的 wrapper 类的属性不再被索引为字符串。相反,它们现在使用 Lucene 的相应数字编码进行索引。id 字段是一个规则的例外。即使它们由数字类型表示,默认情况下它们仍然会作为字符串关键字进行索引。@NumericField 的使用现已过时,除非您要为数字编码指定自定义精确度。您可以通过显式指定字符串编码字段桥接来保留旧的基于字符串的索引格式。对于整数,这是 org.hibernate.search.bridge.builtin.IntegerBridge。检查 org.hibernate.search.bridge.builtin 软件包,以查找其他公开可用的字段网桥。
date 和 Calendar 不再作为字符串索引。相反,实例编码为长值,代表 1970 年 1 月 1 日的毫秒数,即 00:00:00。您可以使用新的 EncodingType 枚举来切换索引格式。例如:
示例: @DateBridge 和 @CalendarBridge Annotation
@DateBridge(encoding=EncodingType.STRING)
@CalendarBridge(encoding=EncodingType.STRING)
数字和日期的编码变化非常重要,可能会对应用程序行为产生重大影响。如果您的查询以之前字符串编码的字段为目标,但现在以数字编码,则必须更新查询。数字字段必须使用 NumericRangeQuery 进行搜索。您还必须确保通过_cot 为目标的所有字段都经过字符串编码。如果您使用 Search 查询 DSL,则会自动为您创建正确的查询。
其他 Hibernate 搜索更改
-
排序选项有所改进,对于排序选项,字段编码会错误地指定,从而导致运行时异常。如果事先知道排序中使用的字段,Lucene 还提供了更高性能的排序。Hibernate Search 5.5 提供新的
@SortableField注释及其多值配套@SortableFields。如需更多信息,请参阅 Hibernate Search 5.4 到 5.5 的迁移指南。 Lucene
SortFieldAPI 需要更改以下应用程序代码:在上一版本的 JBoss EAP 中,您将按照如下所示设置查询中的 sort 字段类型:
fulltextQuery.setSort(new Sort(new SortField("title", SortField.STRING)));以下是您在 JBoss EAP 7 中设置它的示例。
fulltextQuery.setSort(new Sort(new SortField("title", SortField.Type.STRING)));-
由于
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。 -
JMS 控制器 API 已经改变。删除了对 Hibernate ORM 的 JMS 后端依赖关系,以便它可以在其他非ORM 环境中使用。因此,
org.hibernate.search.backend.impl.jms.AbstractJMSHibernateSearchController的实现器必须调整为新签名。此类是内部类,建议将它用作示例,而不是进行扩展。 -
org.hibernate.search.spi.ServiceProviderSPI 被重构。如果您与旧服务合同集成,请参阅ServiceManager、Service、Startable 和的 Hibernate Search 5.5 Javadoc 了解有关新合同的详细信息。Stoppable -
如果您已保留 Lucene 3.x 生成并且尚未使用 Hibernate Search 5.0 或更高版本重新构建的索引,您将获得
IndexFormatTooOldException。建议您使用 massive indexer 重新构建索引。如果您无法做到这一点,请尝试使用 Lucene 的IndexUpgrader。如果默认行为发生更改,您必须仔细更新 Hibernate Search 映射。如需更多信息,请参阅 Apache Lucene 迁移指南。 - Apache Lucene 在 JBoss EAP 7 中已从 3.6 升级到 5.3。如果您的代码直接导入 Lucene 代码,请参阅 Apache Lucene 迁移指南以了解更改的详情。其他信息也可在 Lucene 更改日志中找到。
-
使用
@Field(indexNullAs=)对索引中的空标记值进行编码时,标记的类型必须与同一字段中索引的所有其他值兼容。例如,之前可以使用字符串"null"为数字字段编码空值。这已不再被允许。相反,您必须选择一个代表null值的数字,如-1。 -
对面市引擎进行了显著改进。大多数更改不会影响 API。个值得注意的例外是,您必须现在给计划用于遇到 @Facet 或
@Facets注释的任何字段添加注解。
Hibernate Search Renamed 和 Repackaged 类
以下是已重新打包或重命名的 Hibernate Search 类的列表。
| 以前的软件包和类 | 新软件包和类 |
|---|---|
| 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 - 重新命名和重新打包的类
查询解析器被移到新模块,从 org.apache.lucene.queryParser.QueryParser.QueryParser 改为 org.apache.lucene.queryparser.classic.QueryParser。
许多 Lucene 分析器被重构,导致打包更改。请参阅 Apache Lucene 文档来查找替换软件包。
某些 Apache Solr 实用程序类(如 TokenizerFactory 或 TokenFilterFactory) 已移到 Apache Lucene 中。如果您的应用程序使用这些实用程序或自定义分析器,则必须在 Apache Lucene 中找到新软件包名称。
如需更多信息,请参阅 Apache Lucene 迁移指南。
Hibernate Search 弃用 API
有关 Hibernate Search 弃用接口、类、数字、注解类型、方法、构造器和枚举常量的完整列表,请参阅 Hibernate Search 弃用 API 文档。
Hibernate 搜索已弃用接口
| Interface | 描述 |
|---|---|
| org.hibernate.search.store.IndexShardingStrategy |
自 Hibernate Search 4.4 弃用.可能会在搜索 5 中删除。改为使用 |
| org.hibernate.search.store.Workspace | 此接口将被移动,并被视为非公共 API。如需更多信息,请参阅 HSEARCH-1915。 |
Hibernate 搜索已弃用的类
| class | 描述 |
|---|---|
| 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 Search 已弃用的枚举
| enum | 描述 |
|---|---|
| org.hibernate.search.annotations.FieldCacheType |
删除 |
Hibernate Search 已弃用注解
| 注解 | 描述 |
|---|---|
| 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) |
Use |
Hibernate Search 已弃用的 Constructors
| 构造器 | 描述 |
|---|---|
| org.hibernate.search.cfg.NumericFieldMapping(PropertyDescriptor, EntityDescriptor, SearchMapping) |
使用 |
影响高级集成商的更改
本节论述了不属于公共 API 一部分的更改。它们不应影响平均开发人员,因为这些构件应仅由扩展 Hibernate Search 框架的集成商访问。
-
IndexWriterSetting.MAX_THREAD_STATES和IndexWriterSetting.TERM_INDEX_INTERVALenum 常数已被弃用。它们会影响从配置中读取哪些属性,因此缺少这些属性意味着现在忽略了hibernate.search.Animals.2.indexwriter.term_index_interval = default等配置属性。唯一的副作用是该属性不会被应用。 -
SearchFactoryIntegrator接口现已弃用。您应该立即迁移所有代码以使用SearchIntegrator。 -
SearchFactoryBuilder类现已弃用。使用SearchIntegrationBuilder代替。 -
HSQuery.getExtendedSearchIntegrator()方法已弃用。可以使用SearchIntegrator,但最好将其完全删除。 -
DocumentBuilderIndexedEntity.getFieldCacheOption()方法已弃用。没有替换。 -
BuildContext.getIndexingStrategy()方法已弃用。UseBuildContext.getIndexingMode()instead. -
DirectoryHelper.getVerifiedIndexDir(String, Properties, boolean)方法已弃用。改为使用DirectoryHelper.getVerifiedIndexPath(java.lang.String, java.util.Properties, boolean)。 以下是已重新打包或重命名的 Hibernate Search 类的列表。
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