我们刚刚发布了 Hibernate Search 6.0.0.Beta6。
除了几个错误修复之外,此版本主要引入了映射器级别的模式管理配置和 API、多值字段的排序、更简单和可配置的索引队列、隐式嵌套谓词以及 Elasticsearch 的离线启动。还包括对 Lucene 8.5、Elasticsearch 7.6.1 和 Hibernate ORM 5.4.13.Final 的升级。
新功能
模式管理配置和 API
在 HSEARCH-3759 和 HSEARCH-3751 中,为了应对更多用例,我们对模式管理进行了重大改进。
现在,通过配置属性 hibernate.search.schema_management.strategy
,在映射器级别配置了一种更简单的管理索引/模式的方法,该方法在启动时隐式地通过预配置的策略进行管理。有几种策略可供选择:none
、create
、validate
、create-or-validate
等。有关更多信息,请参阅 自动模式管理。
自动模式管理策略现在默认为 |
新的方法是显式管理索引/模式,启动后随时可以进行。这涉及到从Hibernate Search获取一个 SearchSchemaManager
,然后调用其方法来按需创建、验证或删除模式。
SearchSchemaManager manager = Search.mapping( sessionFactory )
.scope( MyEntity.class ) // Use `Object.class` to target all indexed entity types
.schemaManager();
manager.dropAndCreate();
// Starting here, the freshly created indexes can be used
有关更多信息,请参阅 模式管理手册。
最后,在重新索引时,可以通过在 MassIndexer
上设置新的 dropAndCreateSchemaOnStart(boolean)
选项来简单地删除和重新创建索引和模式。有关更多信息,请参阅 MassIndexer参数。
Elasticsearch后端离线启动
多亏了Alexis Cucumel(《HSEARCH-3841》)的努力,现在可以在完全离线模式下启动Hibernate Search。
为此
-
使用属性
hibernate.search.backends.<backend name>.version
配置Elasticsearch集群的预期版本,并使用属性hibernate.search.backends.<backend name>.version_check.enabled
禁用启动时的版本检查。 -
将属性
hibernate.search.schema_management.strategy
设置为none
以禁用启动时的自动模式管理。 -
如有必要,在您的应用程序中添加显式模式管理代码,在您知道Elasticsearch集群已启动和运行时触发。
多值字段的排序
自HSEARCH-3103以来,Hibernate Search现在能够对多值字段进行排序。默认情况下,将选择每个文档的最小值进行升序排序,最大值进行降序排序。
可以使用排序DSL中的新 mode(SortMode)
方法来告诉Hibernate Search如何选择排序值。
List<Author> hits = searchSession.search( Author.class )
.where( f -> f.matchAll() )
.sort( f -> f.field( "books.pageCount" ).mode( SortMode.AVG ) )
.fetchHits( 20 );
有关更多信息,请参阅此部分文档。
感谢Waldemar Kłaczyński对实现所做的贡献。
隐式嵌套谓词
到目前为止,使用对象字段的“嵌套”存储意味着你必须用nested
谓词包装访问其子字段的每个谓词,即使只有一个谓词也是如此。
自HSEARCH-3752以来,Hibernate Search为你做了这件事:现在默认添加嵌套谓词,除非明确提及。
这意味着这个查询
List<Book> hits = searchSession.search( Book.class )
.where( f -> f.nested().objectField( "authors" )
.nest( f.match().field( "authors.lastName" )
.matching( "asimov" ) )
.fetchHits( 20 );
...现在可以简单地写成这样(以前不会匹配任何内容)
List<Book> hits = searchSession.search( Book.class )
.where( f -> f.match().field( "authors.lastName" )
.matching( "asimov" ) )
.fetchHits( 20 );
如果你实际上需要一个在同一嵌套对象上有多个谓词的条件,你仍然需要用
|
简单查询字符串中的标志
多亏了Waldemar Kłaczyński(《HSEARCH-3847》)的努力,现在可以配置简单查询字符串谓词以启用或禁用所需的语法功能。
List<Book> hits = searchSession.search( Book.class )
.where( f -> f.simpleQueryString().field( "title" )
.matching( "I want a **robot**" )
.flags( SimpleQueryFlag.AND, SimpleQueryFlag.OR, SimpleQueryFlag.NOT ) )
.fetchHits( 20 );
更简单、可配置的索引队列
Hibernate Search中的索引涉及将操作推送到队列,并在后台线程中执行这些操作。
在HSEARCH-3575中,引入了关于后台线程(Lucene,Elasticsearch)和队列(Lucene,Elasticsearch)的几个新配置选项。
在HSEARCH-3822和HSEARCH-3872中,我们对索引操作编排进行了几个改进,特别是允许单个索引的并行索引,并通常简化了代码。
最后,为了最大限度地利用并行索引,在HSEARCH-3871中,我们将Lucene后端提交的默认配置切换了:在大量索引时,现在每秒提交一次,而不是之前每大约1000个文档提交一次的行为。
版本升级
-
HSEARCH-3867:升级到Lucene 8.5.0
-
HSEARCH-3870:升级到Elasticsearch 7.6.1
-
HSEARCH-3873:升级到Hibernate ORM 5.4.13.Final
Hibernate Search 6需要ORM 5.4.4.Final或更高版本才能正确工作。早期的5.4.x版本将无法正确工作。 |
不兼容的变更
-
Lucene后端可排序字段的内部docvalues格式已更改。如果您的索引包含可排序字段,则需要重新索引。
-
与Elasticsearch索引生命周期管理相关的配置属性已更改
-
配置属性
lifecycle.strategy
已被删除,如果使用它,则启动时会触发异常。有关启动时的自动模式管理,请参阅映射级别的新schema_management
选项(新选项)。 -
配置属性
lifecycle.minimal_required_status
已重命名为schema_management.minimal_required_status
。 -
配置属性
lifecycle.minimal_required_status_wait_timeout
已重命名为schema_management.minimal_required_status_wait_timeout
。
-
其他改进和错误修复
-
HSEARCH-3796:
@IndexedEmbedded
现在可以多次应用于相同的getter/field。您只需要不同的prefix
。 -
HSEARCH-3850:现在有一个新工具可用于在配置Hibernate Search时构建属性键。有关更多信息,请参阅文档中的此部分。
-
HSEARCH-3844:在Lucene后端使用简单查询字符串谓词对非分析的、非归一化的字段进行查询时不再触发
NullPointerException
。感谢Waldemar Kłaczyński报告此问题。 -
HSEARCH-3845:由简单查询字符串谓词在Lucene后端生成的前缀查询不再跳过输入文本的归一化。感谢Waldemar Kłaczyński报告并修复此问题。
-
HSEARCH-3851/HSEARCH-3852:已解决与索引失败报告相关的多个问题。
-
HSEARCH-3857:在索引具有
@IndexEmbedded
依赖关系的多个实体时,在非常特定的场景中会抛出ConcurrentModificationException
;已修复。感谢Alexis Cucumel报告并修复此问题。 -
HSEARCH-3859:在Lucene后端基于
double
/float
字段的.desc().missing().last()
/.asc().missing().first()
不再将文档放置在0
周围,而是按预期放置在最后/最前。 -
HSEARCH-3861:Elasticsearch 搜索查询不再在没有显式投影定义的情况下无谓地获取整个文档源。
-
HSEARCH-3869:Elasticsearch 批处理操作失败不再导致
IndexOutOfBoundsException
。 -
HSEARCH-3874:在实体上应用
@IdClass
(即使不是@Indexed
),在启动 Hibernate Search 时不再导致NullPointerException
。
还有更多。有关自上次发布以来的所有更改的完整列表,请参阅发行说明。
如何获取此版本
所有详细信息均可在hibernate.org上的专用页面上找到,并保持最新。