7.7. 索引优化
Lucene 索引需要不时地进行优化。进程本质上是碎片整理。在触发优化前,Lucene 仅标记已删除的文档,不会应用物理文件。在优化过程中,将应用删除,这也会影响 Lucene 目录中的文件数量。
优化 Lucene 索引可以加快搜索速度,但不影响索引(更新)性能。在优化期间,可以执行搜索,但很有可能会减慢速度。所有索引更新都将停止。建议您调度优化:
优化 Lucene 索引可以加快搜索速度,但不影响索引更新性能。可以在优化过程中执行搜索,但它们比预期要慢。所有索引更新在优化过程中都会被保留。因此,建议调度优化:
- 在空闲的系统上或搜索频率最低时。
- 应用大量索引修改后。
MassIndexer 在处理开始和结束时默认优化索引。使用 MassIndexer.optimizeAfterPurge 和 MassIndexer.optimizeOnFinish 更改此默认行为。如需更多信息 ,请参阅使用 MassIndexer。
7.7.1. 自动优化 复制链接链接已复制到粘贴板!
Hibernate 搜索可以在以下任一后自动优化索引:
Infinispan Query 在以下自动优化索引:
- 特定的操作(插入或删除)。
- 特定的交易量。
自动索引优化配置可以全局定义,也可以为每个索引定义:
示例:定义自动优化参数
hibernate.search.default.optimizer.operation_limit.max = 1000 hibernate.search.default.optimizer.transaction_limit.max = 100 hibernate.search.Animal.optimizer.transaction_limit.max = 50
hibernate.search.default.optimizer.operation_limit.max = 1000
hibernate.search.default.optimizer.transaction_limit.max = 100
hibernate.search.Animal.optimizer.transaction_limit.max = 50
优化过程会立即触发 Animal 索引:
-
添加和删除的数量达到
1000。 -
事务数量达到
50(hibernate.search.Animal.optimizer.transaction_limit.max)具有高于hibernate.search.default.optimizer.transaction_limit.max的优先级。
如果没有定义任何这些参数,则不会自动处理优化。
OptimizerStrategy 的默认实现可以被实现 org.hibernate.search.store.optimization.OptimizerStrategy 覆盖,并将 optimizer. implementation 属性 设置为实施的完全限定名称。此实施必须实施 接口(为公共类),并且具有不带任何参数的公共构造器。
示例:载入自定义 OptimizerStrategy
hibernate.search.default.optimizer.implementation = com.acme.worlddomination.SmartOptimizer hibernate.search.default.optimizer.SomeOption = CustomConfigurationValue hibernate.search.humans.optimizer.implementation = default
hibernate.search.default.optimizer.implementation = com.acme.worlddomination.SmartOptimizer
hibernate.search.default.optimizer.SomeOption = CustomConfigurationValue
hibernate.search.humans.optimizer.implementation = default
关键字 default 可用于选择 Hibernate Search 默认实施;启动时,.optimizer 键分隔符之后的所有属性都将传递给实施的初始方法。
7.7.2. 手动优化 复制链接链接已复制到粘贴板!
您可以通过 SearchFactory 以编程方式从 Hibernate Search 优化(碎片)Lucene 索引:
示例:编程索引优化
第一个示例优化了保存顺序的 Lucene 索引,第二个示例优化了所有索引。
searchFactory.optimize() 对 Jakarta 消息传递后端没有影响。您必须在 Master 节点上应用优化操作。
searchFactory.optimize() 应用到 master 节点,因为它不会影响 Jakarta Messaging 后端。
7.7.3. 调整优化 复制链接链接已复制到粘贴板!
Apache Lucene 有几个参数可影响执行优化的方式。Hibernate Search 可公开这些参数。
进一步索引优化参数包括:
-
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.ram_buffer_size -
hibernate.search.[default|<indexname>].indexwriter.term_index_interval