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

我们刚刚发布了 Hibernate Search 6.0.0.Beta10。

此版本主要带来了总命中次数阈值、条件索引、更好的超时设置以及针对 Elasticsearch 的每个索引分析器定义。

还包括 Lucene 8.6.1、Elasticsearch 7.9.0 和 Hibernate ORM 5.4.21.Final 的升级。

开始使用 Hibernate Search 6

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

Hibernate Search 6 的 API 与 Hibernate Search 5 有显著差异。

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

新增功能

总命中次数阈值

HSEARCH-3517 开始,Hibernate Search 现在可以利用 Lucene 的总命中次数阈值。

这种优化通常在网页搜索引擎中可以看到,总命中数以“超过 1,000,000 次命中”或其他大数字的形式显示,而不是确切的计数。

如果您的应用程序处理大型索引,并且可以接受对具有大量命中结果的查询的总命中次数的低估计,以从查询执行时间中节省几毫秒,那么您可以尝试它:您可以在 文档的这一部分 中找到更多信息。

此优化仅在执行默认按分数排序的搜索查询时适用。任何其他自定义排序可能都会阻止此优化应用。

条件索引

Hibernate Search 5曾允许通过定义实体索引拦截器来实现条件索引。这在仅需要对实体子集进行索引时特别有用,例如仅对状态为PUBLISHED的实体进行索引,而其他实体应被忽略。

HSEARCH-3108开始,此功能回归Hibernate Search 6,但形式略有不同。您需要定义一个RoutingBridge,而不是覆盖索引操作(添加/更新/删除等),而是定义文档在索引时应遵循的路线(可能没有路线,当不索引时)。

有关更多信息,请参阅文档的此部分

Elasticsearch的按索引分析器定义

HSEARCH-3309开始,使用Elasticsearch后端,现在可以在特定索引上定义分析器,而不是在所有索引上全局定义。

这在向现有应用程序添加非常特定的分析器时特别有用,并且当此分析器仅对少数索引相关时:现在您只需在这些索引上添加分析器,如果映射未在其他任何方式更改,则无需重新创建不受影响的索引。

为特定索引配置分析器与设置配置属性hibernate.search.backend.indexes.<index name>.analysis.configurer为您的分析配置器名称/类一样简单。这将覆盖后端级别的分析配置器,允许您根据需要为此索引(仅为此索引)配置分析器和规范器。

有关更多信息,请参阅文档的此部分

改进的超时时间

HSEARCH-3787开始,搜索查询超时现在将在加载实体时正确传递给Hibernate ORM。

以前,当在搜索查询上设置500ms超时时,如果Lucene或Elasticsearch执行花费200ms,然后数据库查询加载实体花费5秒,则超时不会触发。现在不再是这种情况。

Hibernate ORM超时仅精确到秒,因为底层层JDBC的限制。因此,在上面的例子中,Hibernate ORM将在1秒后终止(这仍然比5秒要好)。

此外,从HSEARCH-2505开始,Elasticsearch后端超时的工作方式略有不同

  • 默认连接超时,如果建立连接花费时间过长则终止连接,从3秒降至1秒。

  • 默认读取超时,如果Elasticsearch响应时间过长则取消请求,从60秒降至30秒。

  • 请求超时,为Hibernate Search处理、发送和接收请求响应设置硬截止日期,现在默认无限制。

    这意味着默认情况下,同时发送许多索引请求,然后长时间等待它们全部处理,不应导致内部超时,因为许多请求都在队列中等待。

  • 需要更高超时的请求(特别是具有显式定义超时的搜索查询)将自动根据每个请求的需要提高请求超时和读取超时。

    这意味着在执行搜索查询时,即使显式指定一个非常大的超时时间,也不再会收到低级超时。

  • 搜索查询的超时现在将适当考虑内部队列中花费的时间。

    这意味着如果一个搜索查询的超时时间是500ms,并且它在内部队列中花费了600ms而没有被发送,它现在将如预期地终止。

版本升级

Hibernate Search 6需要ORM 5.4.4.Final或更高版本才能正确工作。更早的5.4.x版本可能导致潜在的神秘运行时异常。

重大变更

  • HSEARCH-3979@IndexedEmbedded(maxDepth = …​)已被重命名为includeDepth。旧语法已弃用,将在6.0.0.Final版本之前删除。

  • SearchResult#totalHitCount()现在已被total().hitCount()取代。旧语法将在6.0.0.Final版本之前删除。

  • RoutingKeyBridgeRoutingKeyBinder现在已被弃用。您应使用RoutingBridgeRoutingBinder代替;请参阅文档中的此部分。旧接口将在6.0.0.Final版本之前删除。

  • HSEARCH-2505:Elasticsearch后端的默认超时已更改(请参阅改进的超时

    • 默认连接超时从3秒降至1秒。

    • 默认读取超时从60秒降至30秒。

    • 请求超时现在默认无限制。

    • 需要更高超时的请求将自动为每个请求基于请求设置相应的超时。

  • Search DSL的一些接口现在有不同的泛型参数;这只会影响将DSL步骤存储到变量的应用程序,这通常不建议使用(请使用流畅的语法代替)。

文档

除了与新功能相关的更改外,文档没有显著变化。

其他改进和错误修复

  • HSEARCH-3975:由Search.toOrmQuery(…​)返回的查询现在支持scroll()scroll(ScrollMode.FORWARD_ONLY)

  • HSEARCH-3980:现在可以通过从元模型获取其描述符,然后调用IndexFieldDescriptor#multiValuedInRoot来确定根文档中的给定字段是否为多值。

  • HSEARCH-3988:调用search(…​).select(…​)不再删除加载选项的类型,防止其定义。

  • HSEARCH-3993:类型charbooleanbytefloatdouble及其相应的包装类型现在可以作为文档标识符直接使用。

等等。有关上一版本以来的完整更改列表,请参阅发布说明

如何获取此版本

所有详细信息都可在hibernate.org上的专用页面上找到并保持最新。

反馈、问题、想法?

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


返回顶部