7.6.3.2. 使用 MassIndexer


Hibernate Search 的 MassIndexer 使用多个并行线程重建索引。您可以选择选择需要重新加载哪些实体或重新索引所有实体。这种方法针对最佳性能进行了优化,但需要将应用程序设置为维护模式。当 MassIndexer 忙碌时,不建议查询索引。

示例:使用 MassIndexer 重新构建索引

fullTextSession.createIndexer().startAndWait();
Copy to Clipboard Toggle word wrap

这将重建索引,将其删除,然后从数据库重新加载所有实体。虽然使用起来简单,但建议进行一些调整以加快流程。

警告

在 MassIndexer 过程中,索引的内容没有定义。如果在 MassIndexer 工作时执行查询,则很可能缺少某些结果。

示例:使用 Tuned MassIndexer

fullTextSession
 .createIndexer( User.class )
 .batchSizeToLoadObjects( 25 )
 .cacheMode( CacheMode.NORMAL )
 .threadsToLoadObjects( 12 )
 .idFetchSize( 150 )
 .progressMonitor( monitor ) //a MassIndexerProgressMonitor implementation
 .startAndWait();
Copy to Clipboard Toggle word wrap

这将重新构建所有用户实例的索引(及子类型),并将创建 12 个并行线程,以在每个查询使用 25 个对象的批处理来加载用户实例。这些相同的 12 个线程还需要处理索引化的嵌入式关系和自定义 FieldBridges 或 ClassBridges,以输出 Lucene 文档。在转换过程中,线程会触发额外属性加载。因此,需要大量并行工作线程。用于实际索引写入的线程数量由每个索引的后端配置定义。

建议将 cacheMode 保留至 CacheMode.IGNORE (默认值),因为在大多数重新索引的情况下,缓存会成为无用的额外开销。根据您的数据启用一些其他缓存模型 可能会很有用,因为如果主实体与索引中包含的类似数字数据相关,可能会提高性能。

注意

实现最佳性能的线程数量理想取决于您的整体架构、数据库设计和数据值。所有内部线程组都有有意义的名称,因此能够使用大多数诊断工具(包括线程转储)轻松识别它们。

注意

MassIndexer 不知道事务,因此无需再开始一项交易或提交。由于它不是事务性的,因此不建议允许用户在处理过程中使用系统,因为它不太可能找到结果,系统负载也可能太高。

其他影响索引时间和内存消耗的参数有:

  • hibernate.search.[default|<indexname>].exclusive_index_use
  • hibernate.search.[default|<indexname>].indexwriter.max_buffered_docs
  • hibernate.search.[default|<indexname>].indexwriter.max_merge_docs
  • hibernate.search.[default|<indexname>].indexwriter.merge_factor
  • hibernate.search.[default|<indexname>].indexwriter.merge_min_size
  • hibernate.search.[default|<indexname>].indexwriter.merge_max_size
  • hibernate.search.[default|<indexname>].indexwriter.merge_max_optimize_size
  • hibernate.search.[default|<indexname>].indexwriter.merge_calibrate_by_deletes
  • hibernate.search.[default|<indexname>].indexwriter.ram_buffer_size
  • hibernate.search.[default|<indexname>].indexwriter.term_index_interval

之前的版本也具有 max_field_length,但这已从 Lucene 中删除。通过使用 LimitTokenCountAnalyzer 可以获得类似的效果。

all .indexwriter 参数是特定于 Lucene 的,Hibernate 搜索通过这些参数.

MassIndexer 使用正向结果仅滚动到要加载的主键,但 MySQL 的 JDBC 驱动程序会加载内存中的所有值。为了避免这个"优化"将 idFetchSize 设置为 Integer.MIN_VALUE

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat