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

我们刚刚发布了Hibernate Search 6.0.0.Alpha3,这是仍在开发的6.0分支的第三个发布版本。本版本主要增加了对更多字段类型和谓词的支持,并带来了更一致且更简洁的API。

Hibernate Search 6入门

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

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

有关该分支的当前状态,请参阅hibernate.org上的Search 6专属页面

有关迁移以及我们打算如何帮助您的更多信息,请参阅迁移指南

新增功能

自上次发布以来已经有一段时间了。但这也意味着我们已经取得了很大的进步!

Quarkus集成

您可能已经听说过Quarkus,这是一个旨在显著提高Java应用程序启动时间和内存使用的框架和工具集。

我们一直在努力将Hibernate Search集成到Quarkus中,并即将发布一个实验性的Quarkus扩展。请保持关注!

大多数基本Java类型现在可以索引

HSEARCH-3047HSEARCH-3503中,我们恢复了索引大多数基本Java类型的能力。

以下类型现在受支持:

  • java.lang.String

  • java.lang.Character, char

  • java.lang.Byte, byte

  • java.lang.Shortshort

  • java.lang.Integerint

  • java.lang.Longlong

  • java.lang.Doubledouble

  • java.lang.Floatfloat

  • java.lang.Booleanboolean

  • java.net.URI

  • java.net.URL

  • java.time.Instant

  • java.time.LocalDate

  • java.time.LocalTime

  • java.time.LocalDateTime

  • java.time.OffsetDateTime

  • java.time.OffsetTime

  • java.time.ZonedDateTime

  • java.time.ZoneId

  • java.time.ZoneOffset

  • java.time.Period

  • java.time.Duration

  • java.time.Year

  • java.time.YearMonth

  • java.time.MonthDay

  • java.util.UUID

  • java.util.Calendar

  • java.util.Date

  • java.sql.Timestamp

  • java.sql.Date

  • java.sql.Time

目前唯一尚未支持的类型是 BigDecimalBigInteger

更多信息请参阅文档

大多数搜索谓词现已实现

在Alpha2版本中,仅实现了部分搜索谓词

  • matchAll

  • id

  • bool

  • match

  • range

  • nested

  • 空间 "within"(距离)

HSEARCH-3091HSEARCH-3256 中,我们确保了在Search 6中实现了Search 5中大多数谓词选项(仅缺少 分析器覆盖)。

HSEARCH-3089 中,我们实现了以下谓词

  • phrase

  • wildcard

  • simpleQueryString

这使得我们几乎与Search 5相当,只缺少 facetmoreLikeThis

统一、更简洁的API

我们一直在努力使Search 6中的API变更真正有价值。

之前的版本确保API更强大,特别是允许安全地创建针对多个索引的谓词或创建类型安全的查询。

在本版本中,我们确保了命名更加一致、简洁且比Search 5中的命名更少冗余。

以下是一个在Search 5中编写的查询示例。

FullTextSession ftSession = Search.getFullTextSession(session);
QueryBuilder bookQb = ftSession.getSearchFactory().buildQueryBuilder().forEntity(Book.class).get();
QueryBuilder dvdQb = ftSession.getSearchFactory().buildQueryBuilder().forEntity(Dvd.class).get();

// Find all long documents: books with more than 500 pages or dvd lasting more than 2 hours
Query luceneQuery = bookQb.bool()
    .should(bookQb.range().onField("pageCount").above(500).createQuery())
    .should(dvdQb.range().onField("durationInMinutes").above(120).createQuery())
    .createQuery();

FullTextQuery query = ftSession.createFullTextQuery(luceneQuery, Book.class, Dvd.class);

query.setMaxResults(pageSize).setFirstResult(selectedPage*pageSize); // Pagination

@SuppressWarnings("unchecked")
List<Document> results = query.list();

以下是在Search 6 Alpha1/Alpha2中的等效查询:没有更多针对类型的查询构建器,没有更多 "lucene query",没有更多必须强制类型转换的原始类型。

FullTextSession ftSession = Search.getFullTextSession(session);

FullTextQuery<Document> query = ftSession.search(Arrays.asList(Book.class, Dvd.class)).query().asEntity()
    .predicate(f -> f.bool()
        .should(f.range().onField("pageCount").above(500))
        .should(f.range().onField("durationInMinutes").above(120))
        .toPredicate()
    )
    .build();

query.setMaxResults(pageSize).setFirstResult(selectedPage*pageSize); // Pagination

List<Document> results = query.list();

以下是在Search 6 Alpha3中的等效查询:没有更多无意义的 query()toPredicate() 调用,对所有类型的统一命名(以 Search 开头)以及统一的方法名称来检索结果(fetchfetchHitsfetchCount 等)。

SearchSession searchSession = Search.getSearchSession(session);

SearchQuery<Document> query = searchSession.search(Arrays.asList(Book.class, Dvd.class)).asEntity()
    .predicate(f -> f.bool()
        .should(f.range().onField("pageCount").above(500))
        .should(f.range().onField("durationInMinutes").above(120))
    )
    .toQuery();

List<Document> results = query.fetchHits(pageSize, selectedPage*pageSize);

有关详细信息,请参阅

  • HSEARCH-3444:减少谓词/投影/排序DSL和索引模式DSL的冗余

  • HSEARCH-3403:移除FullTextQuery/FullTextSession到相应Hibernate ORM类型的继承

  • HSEARCH-3498:将可选谓词DSL参数移动到终端上下文

  • HSEARCH-3511:使Search API的入口点更直观

我们还更改了在桥梁中向文档添加值的语法:请参阅 HSEARCH-3295

最后,我们使Elasticsearch和Lucene后端之间的配置属性名称更一致:HSEARCH-3482

文档

文档内容仍然较少,但仍在不断增长。我们特别记录了配置属性(HSEARCH-3473,见此处)和从 java.util 使用日期/时间类型的限制(HSEARCH-3509,见此处)。

版本升级

  • HSEARCH-3483:升级到 Lucene 7.7.0

  • HSEARCH-3520:升级到 Elasticsearch 6.6.2

  • HSEARCH-3490:现在实验性地支持 Elasticsearch 7.0.0-beta1。

  • HSEARCH-3514:我们将自动模块名称恢复到我们的 JAR 中,因此可以从您的 module-info.java 安全地引用。

    附录(2019-04-05):发现仍然存在从 Java 模块使用 Hibernate Search 的问题。见HSEARCH-3551

  • HSEARCH-3485HSEARCH-3493:Hibernate Search 仍针对 JDK8 和 JDK11,但现在我们也定期测试与 JDK12 和 JDK13 的兼容性。

其他改进和错误修复

  • HSEARCH-3424:展示模块现在使用 Spring Boot,以展示如何在应用程序中使用 Hibernate Search 的示例。见GitHub 上的代码

  • HSEARCH-3257:允许在投影中绕过桥梁

  • HSEARCH-2658:支持在所有用户提供的组件中使用 @Inject:桥梁、配置器等

  • HSEARCH-1640:布尔字段永远不会被分析

  • HSEARCH-2908:对 'java.lang.Short and java.lang.Byte' 字段的 Elasticsearch 映射不正确

  • HSEARCH-3481:将 max_connections_per_route 的默认值更改为 10

  • HSEARCH-3251:在 Elasticsearch 中避免“模糊”查询,并优先使用带有“fuzziness”参数的“匹配”查询

  • HSEARCH-2248:从 DSL 中删除模糊查询的过时阈值方法

  • HSEARCH-3477:在 Lucene 后端跨不同索引查询全文字段时出现不兼容的类型错误

  • HSEARCH-3489:当 Hibernate Search 找不到关联的逆端时,改进错误消息

  • HSEARCH-3529:MassIndexer 对于具有原始 ID 类型的实体失败

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

如何获取此版本

所有详细信息均可在 hibernate.org 上的专用页面 上找到并更新。

反馈、问题、想法?

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


返回顶部