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

我们刚刚发布了 Hibernate Search 6.0.0.Alpha4,这是 6.0 分支的第四个发布版本。本版本主要增加了“存在”谓词,通过允许绕过 DSL 和投影转换器或覆盖分析器来改进 DSL,恢复了 Elasticsearch AWS 集成,并将 Lucene 后端升级到 Lucene 8。

开始使用 Hibernate Search 6

如果您想立即深入了解新的、炫酷的 Hibernate Search 6,参考文档中的 入门指南 是一个好的起点。

Hibernate Search 6 仍在开发中,其 API 与 Search 5 有很大差异。

有关此分支的当前状态的更多信息,请参阅 hibernate.org 上 Search 6 的专用页面

有关迁移和我们将如何帮助您的更多信息,请参阅 迁移指南

新增功能

新的“存在”谓词

我们在 Search DSL 中增加了对“存在”谓词的支持,允许根据给定字段的非 null 值的存在或不存在来过滤文档

SearchQuery<MyEntity> query = searchSession.search(MyEntity.class).asEntity()
    .predicate(f -> f.exists().onField("someField"))
    .toQuery();

Elasticsearch AWS 集成已恢复

我们作为HSEARCH-3051的一部分恢复了AWS集成。请参阅HSEARCH-3051。在文档中专用部分配置您的后端以与AWS管理的Elasticsearch服务通信。

谓词中可以绕过转换器

DSL和投影转换器自动将用户期望的类型转换为后端暴露的底层类型。例如,java.util.Date属性之间有转换器。

就像Search 5中的.ignoreFieldBridge选项一样,现在在Search 6中也有一个选项来绕过这些转换器

// When the value to match is a java.util.Date
Date dateToMatch = /* ... */;
SearchQuery<MyEntity> query = searchSession.search(MyEntity.class).asEntity()
    .predicate(f -> f.match().onField("myJavaUtilDate").matching(dateToMatch))
    .toQuery();

// When the value to match is a java.time.Instant
Instant instantToMatch = /* ... */;
SearchQuery<MyEntity> query = searchSession.search(MyEntity.class).asEntity()
    .predicate(f -> f.match().onField("myJavaUtilDate").matching(instantToMatch, DslConverter.DISABLED))
    .toQuery();
// When we need the projection as a java.util.Date
SearchQuery<Date> query = searchSession.search(MyEntity.class)
    .asProjection(f -> f.field("myJavaUtilDate", Date.class)
    .predicate(f -> f.matchAll())
    .toQuery();

// When we need the projection as a java.time.Instant
SearchQuery<Instant> query = searchSession.search(MyEntity.class)
    .asProjection(f -> f.field("myJavaUtilDate", Instant.class, ProjectionConverter.DISABLED)
    .predicate(f -> f.matchAll())
    .toQuery();

查询时可以覆盖分析器

分析器已经在Search 5中可以覆盖,但只能在QueryBuilder级别和按字段逐个覆盖,如果你在谓词中有许多字段或者需要两个具有不同覆盖的谓词,这可能会很麻烦。

在Search 6中,现在可以按谓词逐个覆盖分析器

SearchQuery<MyEntity> query = searchSession.search(MyEntity.class).asEntity()
    .predicate(f -> f.match().onField("name_autocomplete").matching(userInput).analyzer("edgengram_query"))
    .toQuery();

配置

HSEARCH-3521开始,索引范围配置属性的属性键现在以前缀.backends.<后端名称>开头。例如

hibernate.search.backends.myBackend.indexes.myIndex.lifecycle.strategy = create

有关更多信息,请参阅参考文档中的配置部分

版本升级

其他改进和错误修复

  • HSEARCH-3507:改进与原生Elasticsearch/Lucene特性相关的命名方法的一致性(fromJsonString等)

  • HSEARCH-3554:Elasticsearch后端默认设置为10个元素命中限制

  • HSEARCH-2534:允许使用仅查询的分析器定义与Elasticsearch一起使用

  • HSEARCH-2185:使用DSL的短语查询不考虑ignoreAnalyzer()选项

  • HSEARCH-2423:投影未存储的字段应使用Elasticsearch引发异常

  • HSEARCH-2518:允许为分析器类/实例分配名称

  • HSEARCH-2757:允许在空间索引时使用FieldSelectors

  • HSEARCH-3530:更新参考文档中的日期格式

  • HSEARCH-3532:修复hibernate-search-util-common的java模块名称

  • HSEARCH-3538:在检查兼容性时忽略投影中的投影转换器的禁用

  • HSEARCH-3540:NONE Elasticsearch索引生命周期策略抛出AssertionFailure异常

  • HSEARCH-3543:允许将GeoPointBridges设置为可排序的以启用距离排序

  • HSEARCH-3548:带有zone = ZoneOffset.UTC的ZonedDateTime在Elasticsearch 5.6索引时失败

  • HSEARCH-3549:在Elasticsearch中索引MonthDay.of( 2, 29 )失败

  • HSEARCH-3557:DST变化期间较晚的偏移量ZonedDateTime被错误地解析

等等。有关自上次发布以来所有更改的完整列表,请参阅发行说明

如何获取此版本

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

反馈、问题、想法?

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


返回顶部