我们刚刚发布了 Hibernate Search 6.0.0.Beta2。此版本主要引入了搜索分析器、改进了后台故障处理,并升级到 Elasticsearch 7.4 和 Hibernate ORM 5.4.7.Final。
新增功能
搜索分析器
自 HSEARCH-3042 以来,现在可以为每个字段定义一个“搜索分析器”,这样在索引时使用一个分析器,在查询时使用另一个分析器。这对于实现带有边缘词元过滤器的自动补全(“边写边搜”)非常有用。
例如
@Entity
@Indexed
public class Book {
@Id
private Long id;
@FullTextField(
name = "title_autocomplete",
analyzer = "autocomplete", (1)
searchAnalyzer = "autocomplete_query" (2)
)
private String title;
// ... getters and setters ...
}
1 | 在索引时应用 autocomplete 分析器(在其他地方定义),它将标准化文本,然后生成边缘 n-gram。 |
2 | 在查询时应用 autocomplete-query 分析器(在其他地方定义),它将标准化文本,但 不会 生成边缘 n-gram。 |
在上面的例子中
-
在索引时,索引文本
QuicK FOX
将生成以下标记:q
、qu
、qui
、quic
、quick
、f
、fo
、fox
,而索引文本quid pro quo
将生成以下标记:q
、qu
、qui
、quid
、p
、pr
、pro
、q
、qu
、quo
。 -
在查询时,查询字符串
quic
只会生成标记quic
。
因此,查询字符串 quic
将匹配包含 QuicK FOX
的文档,但不会匹配仅包含 quid pro quo
的文档。
如果没有搜索分析器,查询字符串 quic
将会使用 autocomplete
分析器进行解析,这将生成标记 q
、qu
、qui
、quic
。因此,查询将匹配 quid pro quo
(它与查询有共同的标记 q
、qu
和 qui
),这显然不是预期的行为。
背景故障处理
已经恢复了与 Hibernate Search 5 类似的背景故障处理支持,并进行了重大改进。
与 Hibernate Search 5 类似
-
在后台线程中发生的无法传播异常到用户线程的故障(例如,Lucene 合并线程中的故障)将被记录。
-
您可以通过插入自定义组件来不同地报告异常:与 Search 5 的
ErrorHandler
类似的FailureHandler
。有关更多信息,请参阅文档中的专用部分。
然而,与 Hibernate Search 5 相比,更多故障将传播到用户线程(Hibernate Search 将抛出一个包含故障详细信息的异常)。特别是
在 Hibernate Search 5 中,大量索引不会因为索引一个实体失败而停止。 同样,在大量索引期间实体索引失败的情况下,Hibernate Search 6 仍然会尝试重新索引每个相关实体。不同之处在于,在大量索引完成后,它会抛出一个异常,包含失败实体的数量和第一次失败的详细信息。其他失败的详细信息仍然推送到故障处理器。 |
版本升级
-
HSEARCH-3742:升级到 Hibernate ORM 5.4.7.Final
-
HSEARCH-3723:升级到 Elasticsearch 7.4.0
-
HSEARCH-3724:升级到 Jackson 2.9.10。
Hibernate Search 6 需要 ORM 5.4.4.Final 或更高版本才能正常工作。较早的 5.4.x 版本将无法正常工作。 |
不兼容 API 的更改
-
HSEARCH-3720:模块
hibernate-search-mapper-pojo
新增了一个工件标识符:hibernate-search-mapper-pojo-base
。由于此模块通常作为传递依赖项被拉取,因此这将对非常少数的应用程序产生影响。 -
HSEARCH-3721:已从 6.0.0.Beta1 中移除所有已废弃的方法。
-
搜索会话
-
Search.getSearchSession(…)
:使用Search.session(…)
代替。 -
createIndexer(…)
:使用massIndexer(…)
代替。
-
-
在获取查询结果时
-
fetch()
(无任何参数):考虑传递一个限制(例如fetch(20)
)。如果您真的想获取所有命中项,请使用fetchAll()
。 -
fetchHits()
(无任何参数):考虑传递一个限制(例如fetchHits(20)
)。如果您真的想获取所有命中项,请使用fetchAllHits()
。
-
-
在谓词 DSL 中
-
onField(String)
/onFields(String…)
/orField(String)
/orFields(String…)
/onObjectField(String)
:使用field(String)
/fields(String…)
/objectField(String)
代替。 -
boostedTo(float)
:使用boost(float)
代替。 -
withConstantScore()
:使用constantScore()
代替。 -
withSlop(int)
:使用slop(int)
代替。 -
范围谓词的
from(…)
/above(…)
/below(…)
:使用between(…)
/atLeast(…)
/atMost(…)
/greaterThan(…)
/lessThan(…)
代替,或对于更复杂的使用情况,使用range(…)
。 -
withAndAsDefaultOperator()
:使用defaultOperator(BooleanOperator.AND)
代替。
-
-
在排序 DSL 中
-
例如
by*()
方法,如byField(…)
、byDistance(…)
等:使用不带by
前缀的版本,例如field(…)
、distance(…)
。 -
onMissingValue()
/sortLast()
/sortFirst()
:使用missing()
/last()
/first()
代替。
-
-
在 Elasticsearch 分析定义 DSL 中:使用
withTokenizer
、withTokenFilters
、withCharFilters
。使用不带with
前缀的方法。
-
-
AutomaticIndexingSynchronizationStrategy
,理论上用户可以实现高级用例,已重写以允许对有关 后台故障处理 的改进。有关此接口及其实现的更多信息,请参阅 javadoc。
其他改进和错误修复
-
HSEARCH-1108:程序化 API 对于具有 @MappedSuperclass 父类的实体不正确。
-
HSEARCH-3084:并行初始化和关闭索引管理器/后端。
-
HSEARCH-3684:@IndexedEmbedded.includePaths 在某些情况下包含过多的字段。
-
HSEARCH-3694:现在正确处理嵌套字段中的单值距离排序。
-
HSEARCH-3193:现在 Lucene 后端正确处理降序距离排序。
-
HSEARCH-3640:通过 ORM 映射器 API 暴露后端/索引。
等等。有关自上一版本以来的完整更改列表,请参阅 发布说明。
如何获取此版本
所有详细信息均可在 hibernate.org 上的 专用页面 上找到并保持最新。