7.2. Configuration


7.2.1. 最低配置

Hibernate Search 旨在为其配置和操作提供灵活性,并且仔细选择默认值以适合大多数用例。至少必须配置目录提供程序及其属性。默认目录提供程序是 filesystem,它使用本地文件系统进行索引存储。有关可用目录提供程序及其配置的详细信息,请参阅 DirectoryProvider 配置

如果您直接使用 Hibernate,必须在配置文件中设置 DirectoryProvider 等设置,可以是 hibernate.propertieshibernate.cfg.xml。如果您通过 Jakarta Persistence 使用 Hibernate,则配置文件为 persistence.xml

其它资源

7.2.2. 配置 IndexManager

Hibernate Search 为这个接口提供几个实现:

  • 基于目录 :默认实施,它使用 Lucene Directory 抽象来管理索引文件。
  • 近实时 :避免在每次提交时清空到磁盘的写入。此索引管理器也基于 目录,但使用 Lucene 的近乎实时 NRT 功能。

要指定默认以外的 IndexManager,请指定以下属性:

hibernate.search.[default|<indexname>].indexmanager = near-real-time

7.2.2.1. 基于目录

基于目录 的实施是默认的 IndexManager 实施。它高度可配置,允许为 reader 策略、后端和目录提供程序进行单独的配置。

7.2.2.2. 接近实时

NRTIndexManager 是默认 索引管理器 的扩展,它利用 Lucene NRT、Near Real Time(低延迟索引写入)功能。但是,它会忽略 lucene 以外的备用后端的配置设置,并在 目录 上获取专用写入锁定。

IndexWriter 不会刷新磁盘的每个更改来提供低延迟。查询可以从未清空的索引写入缓冲区读取更新的状态。但是,这意味着如果 IndexWriter 被终止或应用程序崩溃,可能会丢失更新,因此必须重建索引。

由于上述缺点,建议对数据有限的非集群网站采用 Near Real Time 配置,因为可以单独配置主节点以提高性能。

7.2.2.3. Custom

为自定义实现指定完全限定类名称,以设置自定义 IndexManager。为实施设置 no-gument 构造器,如下所示:

[default|<indexname>].indexmanager = my.corp.myapp.CustomIndexManager

自定义索引管理器实现不需要与默认实施相同的组件。例如,委派到不公开 目录 接口的远程索引服务。

7.2.3. DirectoryProvider 配置

DirectoryProvider 是围绕 Lucene Directory 的 Hibernate 搜索抽象,处理底层 Lucene 资源的配置和初始化。目录提供程序及其属性 显示了 Hibernate Search 中提供的目录提供程序的列表,以及对应的选项。

每个索引化实体都与 Lucene 索引关联(多个实体共享同一索引的情况除外)。索引的名称由 @Indexed 注释的 index 属性提供。如果未指定 索引 属性,则索引的类的完全限定名称将用作名称(推荐)。

DirectoryProvider 及任何其他选项都可使用前缀 hibernate.search.<indexname> 进行配置。名称 default (hibernate.search.default)保留,可用于定义适用于所有索引的属性。配置目录提供程序 显示如何使用 hibernate.search.default.directory_provider 将默认目录提供程序设置为文件系统。Hibernate.search.default.indexBase 设置索引的默认基础目录。因此,在 /usr/lucene/indexes/org.hibernate.example.Status 中创建实体 状态 索引。

但是,规则 实体的索引正在使用内存中目录,因为此实体的默认目录提供商将被属性 hibernate.search.Rules.directory_provider 覆盖

最后,Action 实体使用由 hibernate.search.Actions.directory_provider 指定的自定义目录供应商 CustomDirectoryProvider

指定索引名称

package org.hibernate.example;

@Indexed
public class Status { ... }

@Indexed(index="Rules")
public class Rule { ... }

@Indexed(index="Actions")
public class Action { ... }

配置目录提供程序

hibernate.search.default.directory_provider = filesystem
hibernate.search.default.indexBase=/usr/lucene/indexes
hibernate.search.Rules.directory_provider = ram
hibernate.search.Actions.directory_provider = com.acme.hibernate.CustomDirectoryProvider

注意

使用上述配置方案,您可以轻松定义常见的规则,如目录提供程序和基础目录,并在以后按索引覆盖这些默认值。

目录提供程序及其属性
RAM
Filesystem

基于文件系统的目录.使用的目录为 <indexBase>/< indexName >

  • indexBase : base directory
  • indexName :覆盖 @Indexed.index(对于分片索引非常有用)
  • locking_strategy : 可选,请参阅 LockFactory 配置
  • filesystem_access_type :允许 确定此 DirectoryProvider 使用的 FSDirectory 实施的确切类型。允许的值为 auto (默认值,在非 Windows 系统上选择 NIOFSDirectory,Windows 上的 SimpleFSDirectory )、SimpleFSDirectory、 nio(NIOFSDirectory)mmap(MMapDirectory)。更改此设置之前,请参阅这些目录实施的 Java 文档。尽管 NIOFSDirectoryMMapDirectory 能够带来显著的性能提升,他们也有自己的问题。
filesystem-master

基于文件系统的目录.比如 文件系统.它还定期将索引复制到源目录(aka copy 目录)。

刷新周期的建议值是(至少) 50%,复制信息的时间要高于 3600 秒 - 60 分钟。

请注意,副本基于增量复制机制,减少了平均复制时间。

DirectoryProvider 通常用于 Jakarta Messaging 后端集群中的主节点。

buffer_size_on_copy Best 取决于您的操作系统和可用的 RAM;大多数用户使用 16 到 64MB 之间的值报告良好的结果。

  • indexBase: base directory
  • indexName :覆盖 @Indexed.index(对于分片索引非常有用)
  • sourceBase :源(复制)基础目录。
  • source :源目录后缀(默认为 @Indexed.index)。实际的源目录名称为 <sourceBase>/<source>
  • 刷新 :刷新周期(每次 刷新 秒将发生一次复制)。如果在以下 刷新 期满时副本仍在进行中,则将跳过第二个复制操作。
  • buffer_size_on_copy :在单个低级复制指令中移动的 MegaBytes 数量;默认为 16MB。
  • locking_strategy : 可选,请参阅 LockFactory 配置
  • filesystem_access_type :允许 确定此 DirectoryProvider 使用的 FSDirectory 实施的确切类型。允许的值为 auto (默认值,在非 Windows 系统上选择 NIOFSDirectory,Windows 上的 SimpleFSDirectory )、SimpleFSDirectory、 nio(NIOFSDirectory)mmap(MMapDirectory)。更改此设置之前,请参阅这些目录实施的 Java 文档。尽管 NIOFSDirectoryMMapDirectory 可以大幅提升性能,但您也需要意识到这些问题。
filesystem-slave

基于文件系统的目录.与 文件系统 类似,但会定期检索主版本(来源)。为避免锁定和不一致的搜索结果,保留 2 个本地副本。

刷新周期的建议值是(至少) 50%,复制信息的时间要高于 3600 秒 - 60 分钟。

请注意,副本基于增量复制机制,减少了平均复制时间。如果 刷新 周期为限时副本仍在进行中,则将跳过第二个复制操作。

DirectoryProvider 通常用于使用 Jakarta 消息传递后端的从节点。

buffer_size_on_copy Best 取决于您的操作系统和可用的 RAM;大多数用户使用 16 到 64MB 之间的值报告良好的结果。

  • indexBase: Base directory
  • indexName :覆盖 @Indexed.index(对于分片索引非常有用)
  • SourceBase:源代码 (复制)基础目录。
  • Source: 源代码 目录后缀(默认为 @Indexed.index)。实际的源目录名称为 <sourceBase>/<source>
  • refresh :刷新周期(复制将每刷新秒发生一次)。
  • buffer_size_on_copy :在单个低级复制指令中移动的 MegaBytes 数量;默认为 16MB。
  • locking_strategy : 可选,请参阅 LockFactory 配置
  • retry_marker_lookup :可选,默认为 0。定义在失败前 Hibernate Search 检查源目录中标记文件的次数。在每次尝试之间等待 5 秒。
  • retry_initialize_period : 可选,以秒为单位设置整数值以启用重试初始化功能:如果从系统找不到主索引,它将再次尝试直到在后台找到它,而不阻止应用启动:在索引初始化前执行的完整Text 查询不会被阻断,而是返回空结果。如果不启用 选项或将其明确设置为零,它将失败,但有一个例外,而不是调度重试计时器。要防止应用程序在没有无效索引的情况下启动,但仍控制初始化超时,请参阅 retry_marker_lookup
  • filesystem_access_type :允许 确定此 DirectoryProvider 使用的 FSDirectory 实施的确切类型。允许的值为 auto(默认值,在非 Windows 系统上选择 NIOFSDirectory,Windows 上的 SimpleFSDirectory )、SimpleFSDirectory、 nio(NIOFSDirectory)mmap(MMapDirectory)。更改此设置之前,请参阅这些目录实施的 Java 文档。尽管 NIOFSDirectoryMMapDirectory 可以大幅提升性能,您也需要意识到这些问题。
注意

如果内置目录提供商不适合您的需要,您可以通过实施 org.hibernate.store.DirectoryProvider 接口来编写自己的目录提供商。在这种情况下,将您的提供程序的完全限定类名称传递到 directory_provider 属性。您可以使用前缀 hibernate.search.<indexname> 传递任何其他属性。

7.2.4. Worker 配置

Hibernate Search 可通过 worker 配置与 Lucene 进行交互。有几个架构组件和可能的扩展点。让我们来详细了解一下.

使用 worker 配置优化 Infinispan Query 与 Lucene 交互的方式。此配置中有多种架构组件和可能的扩展点。

首先有一名 工作者Worker 界面的实施负责接收所有实体更改,按照上下文排队,并在上下文结束时应用它们。最为直观的上下文(特别是在与 ORM 的连接时)就是事务。因此,Hibernate Search 默认使用 TransactionalWorker 来限制每次事务的所有更改。但是,可以想象一下上下文取决于实体数量或其它应用程序生命周期事件的情况。

Expand
表 7.1. 范围配置
属性描述

hibernate.search.worker.scope

要使用的 工作程序 实施的完全限定类名称。如果未设置此属性,则使用默认的 TransactionalWorker,或 进行交易

hibernate.search.worker.*

前缀为 hibernate.search.worker 的所有 配置属性均在初始化过程中传递给工作程序。这允许添加自定义的 worker 特定参数。

hibernate.search.worker.batch_size

定义每个上下文所批处理索引操作的最大数量。旦达到限制,即使上下文尚未结束,也会触发索引。只有 工作程序 实施将排队的队列处理程序委派给批处理队列程序(Trach alWorker 所执行的操作)时才有效。

上下文结束后,应准备和应用索引更改。这可以在新线程内同步或异步完成。同步更新具有索引始终与数据库同步的优势。另一方面,异步更新可以帮助最小化用户响应时间。缺点是数据库和索引状态之间可能存在差异。

注意

以下选项在每个索引上可能会有所不同;实际上,它们需要 indexName 前缀或使用 default 来为所有索引设置默认值。

Expand
表 7.2. 执行配置
属性描述

hibernate.search.<indexName>.​worker.execution

同步 :同步执行(默认)

async :异步执行

hibernate.search.<indexName>.​worker.thread_pool.size

后端可以使用线程池并行应用来自同一事务上下文(或批处理)的更新。默认值为 1。如果您每次事务都有多个操作,则可以使用更大的值进行试验。

hibernate.search.<indexName>.​worker.buffer_queue.max

定义线程池不足时的最大工作队列数。仅适用于异步执行.默认为无限.如果达到限制,则工作由主线程完成。

目前,所有工作都在同一个虚拟机(VM)中完成,无论哪种执行模式。单个虚拟机的工作总量还没有改变。幸运的是,有一个更好的方法,即委派。通过配置 hibernate.search.default.worker.backend,可以将索引工作发送到其他服务器。同样,这个选项可以针对每个索引配置不同。

Expand
表 7.3. 后端配置
属性描述

hibernate.search.<indexName>.​worker.backend

Luc ene:在同一虚拟机中运行索引更新的默认后端。也会在 属性未定义或为空时使用。

JMS:J akarta 消息传递后端.索引更新发送到 Jakarta Messaging 队列,由索引 master 处理。 如需了解更多配置选项以及此设置的更详细说明,请参阅 Jakarta Messaging 后端 配置。

Blackhole :主要是一个 test/developer 设置,忽略所有索引工作

您还可以指定实施 BackendQueueProcessor 的类的完全限定名称。这样,您可以实施自己的通信层。实施负责返回 可运行 的实例,执行时将处理索引工作。

  1. Jakarta 消息传递后端配置
Expand

属性

描述

hibernate.search.<indexName>.​worker.jndi.*

定义 Java 命名和目录接口属性,以启动 InitialContext(如有必要)。Java 命名和目录接口仅供 Jakarta 消息传递后端使用。

hibernate.search.<indexName>.​worker.jms.connection_factory

Jakarta 消息传递后端必填.定义 Java 命名和目录接口名称,以查找 Jakarta Messaging 连接工厂(红帽 JBoss 企业应用平台中默认为/ConnectionFactory

hibernate.search.<indexName>.​worker.jms.queue

Jakarta 消息传递后端必填.定义 Java 命名和目录接口名称,从中查找 Jakarta 消息传递队列。该队列将用于发布工作消息。

警告

正如您可能注意到的,一些显示的属性是相关联的,这意味着并非所有属性值组合都有意义。实际上,您可以生成非功能配置。这在您自己提供部分显示接口的实现的情况下尤为正确。在编写自己的工作 程序或 后端队列程序实施 前,请务必研究现有的代码。

7.2.4.1. Jakarta Messaging Master/Slave Backd

这部分论述了如何配置主/从 Hibernate Search 架构。

图 7.3. Jakarta 消息传递后端配置

Jakarta 消息传递服务后端配置

7.2.4.2. 从属节点

每个索引更新操作都会发送到 Jakarta 消息传递队列。索引查询操作在本地索引副本中执行。

Jakarta Messaging Slave 配置

### slave configuration

## DirectoryProvider
# (remote) master location
hibernate.search.default.sourceBase = /mnt/mastervolume/lucenedirs/mastercopy

# local copy location
hibernate.search.default.indexBase = /Users/prod/lucenedirs

# refresh every half hour
hibernate.search.default.refresh = 1800

# appropriate directory provider
hibernate.search.default.directory_provider = filesystem-slave

## Back-end configuration
hibernate.search.default.worker.backend = jms
hibernate.search.default.worker.jms.connection_factory = /ConnectionFactory
hibernate.search.default.worker.jms.queue = queue/hibernatesearch
#optional jndi configuration (check your Jakarta Messaging provider for more information)

## Optional asynchronous execution strategy
# hibernate.search.default.worker.execution = async
# hibernate.search.default.worker.thread_pool.size = 2
# hibernate.search.default.worker.buffer_queue.max = 50

注意

建议使用文件系统本地副本来加快搜索结果。

7.2.4.3. Master 节点

每个索引更新操作都从 Jakarta 消息传递队列执行并执行。主索引定期复制。

执行 Jakarta Messaging 队列中的索引更新操作,并定期复制主索引。

Jakarta 消息传递服务主配置

### master configuration

## DirectoryProvider
# (remote) master location where information is copied to
hibernate.search.default.sourceBase = /mnt/mastervolume/lucenedirs/mastercopy

# local master location
hibernate.search.default.indexBase = /Users/prod/lucenedirs

# refresh every half hour
hibernate.search.default.refresh = 1800

# appropriate directory provider
hibernate.search.default.directory_provider = filesystem-master

## Back-end configuration
#Back-end is the default for Lucene

除了 Hibernate Search 框架配置外,还必须编写和设置消息驱动型 Bean,以便通过 Jakarta Messaging 处理索引工作队列。

消息驱动的 Bean 处理索引队列

@MessageDriven(activationConfig = {
      @ActivationConfigProperty(propertyName="destinationType",
                                propertyValue="javax.jms.Queue"),
      @ActivationConfigProperty(propertyName="destination",
                                propertyValue="queue/hibernatesearch"),
      @ActivationConfigProperty(propertyName="DLQMaxResent", propertyValue="1")
   } )
public class MDBSearchController extends AbstractJMSHibernateSearchController
                                 implements MessageListener {
    @PersistenceContext EntityManager em;

    //method retrieving the appropriate session
    protected Session getSession() {
        return (Session) em.getDelegate();
    }

    //potentially close the session opened in #getSession(), not needed here
    protected void cleanSessionIfNeeded(Session session)
    }
}

本例继承了 Hibernate Search 源代码中提供的抽象 Jakarta 消息传递控制器类,并实施 Jakarta EE MDB。此实施以示例形式提供,并可通过利用非 Jakarta EE 消息驱动型 Bean 而进行调整。

7.2.5. 调优 Lucene 索引

7.2.5.1. 调优 Lucene 索引性能

Hibernate Search 用于通过指定传递给底层 Lucene IndexWriter (如 mergeFactor、 maxMergeDocs 和 maxBufferedDocs 的一组参数来调整 Lucene 索引性能。指定这些参数作为为所有索引应用、基于索引甚至每个分片的默认值。

有几个低级别 IndexWriter 设置可以针对不同的用例进行调整。这些参数按照 indexwriter 关键字分组:

hibernate.search.[default|<indexname>].indexwriter.<parameter_name>

如果没有在特定分片配置中为 索引写入器值 设置值,Hibernate Search 会检查 index 部分,然后在 default 部分。

下表中的配置将导致这些设置应用于 Animal 索引的第二个分片

  • max_merge_docs = 10
  • merge_factor = 20
  • ram_buffer_size = 64MB
  • term_index_interval = Lucene default

所有其他值将使用 Lucene 中定义的默认值。

所有值的默认值都是保留为 Lucene 自己的默认值。索引 性能和行为属性 中列出的值取决于您使用的 Lucene 版本。显示的值相对于版本 2.4

注意

以前版本的 Hibernate Search 具有 批处理事务 属性的概念。情况已不再如此,因为后端始终使用相同的设置执行工作。

Expand
表 7.4. 索引性能和行为属性
属性描述默认值

hibernate.search.[default|<indexname>].​exclusive_index_use

当其他进程不需要写入同一索引时,设置为 true。这可让 Hibernate 搜索在索引上以独占模式工作,并在写入索引更改时提高性能。

True (提高性能,仅在关机时发布锁定)

hibernate.search.[default|<indexname>].max_queue_length

每个索引都有一个单独的"pipeline",其中包含要应用到索引的更新。当此队列满时,向队列添加更多操作将变为阻止操作。除非 worker.execution 配置为 async,否则配置此设置没有太大意义。

1000

hibernate.search.[default|<indexname>].indexwriter.max_buffered_delete_terms

确定应用和清空缓冲区内删除术语前所需的最小删除术语数量。如果当时内存中有被缓冲的文档,则它们会被合并并创建新的网段。

禁用(按 RAM 使用情况清空)

hibernate.search.[default|<indexname>].indexwriter.max_buffered_docs

控制索引期间内存中缓冲的文档数量。消耗的 RAM 量越大。

禁用(按 RAM 使用情况清空)

hibernate.search.[default|<indexname>].indexwriter.max_merge_docs

定义片段中允许的最大文件数。较小的值在经常更改索引时表现更好,如果索引不经常改变,更大的值可以提供更好的搜索性能。

无限(Integer.MAX_VALUE)

hibernate.search.[default|<indexname>].indexwriter.merge_factor

控制片段合并频率和大小。

确定插入时段索引的合并频率。使用较小的值时,索引和搜索未优化索引时会使用较少的 RAM,但索引速度较慢。当值较大时,索引期间会使用更多的 RAM,而搜索未优化索引时速度较慢,索引速度也更快。因此,较大的值(> 10)最适合创建批处理索引,更适合以互动方式维护的索引的更小的值(< 10)。该值不能低于 2。

10

hibernate.search.[default|<indexname>].indexwriter.merge_min_size

控制片段合并频率和大小。在下一个片段合并操作中始终考虑小于这个大小的片段(以 MB 为单位)。设置这个太大可能会导致合并操作昂贵,即使它们的频率较低。See also org.apache.lucene.index.LogDocMergePolicy.minMergeSize.

0 MB(实际为 ~1K)

hibernate.search.​[default|<indexname>].​indexwriter.merge_max_size

控制片段合并频率和大小。

大于这个大小的片段(以 MB 为单位)永远不会合并到更大的网段。

这有助于降低内存要求并避免以最佳搜索速度为代价进行一些合并操作。在优化索引时,这个值将被忽略。

See also org.apache.lucene.index.LogDocMergePolicy.maxMergeSize.

无限

hibernate.search.[default|<indexname>].indexwriter.merge_max_optimize_size

控制片段合并频率和大小。

即使优化索引,大于这个大小的片段(以 MB 为单位)也不会合并(请参阅 merge_max_size 设置)。

应用到 org.apache.lucene.index.LogDocMergePolicy.maxMergeSizeForOptimize.

无限

hibernate.search.[default|<indexname>].indexwriter.merge_calibrate_by_deletes

控制片段合并频率和大小。

设置为 false,在估算合并策略时不考虑删除的文档。

应用到 org.apache.lucene.index.LogMergePolicy.calibrateSizeByDeletes.

true

hibernate.search.[default|<indexname>].indexwriter.ram_buffer_size

控制专用于文档缓冲区的 RAM 量(以 MB 为单位)。在一起使用 max_buffered_docs 时,会首先进行刷新(以此类事件为准)。

通常,为了提高索引性能,最好使用 RAM 刷新,而不是按文档计数进行清除,并使用尽可能大的 RAM 缓冲区。

16 MB

hibernate.search.[default|<indexname>].indexwriter.term_index_interval

设置索引术语之间的间隔。

较大的值会导致 IndexReader 使用的内存减少,但随机访问速度较慢。Small 值会导致 IndexReader 使用更多内存,并加快对术语的随机访问。详情请查看 Lucene 文档。

128

hibernate.search.[default|<indexname>].indexwriter.use_compound_file

使用复合文件格式的优点是使用较少的文件描述符。缺点是索引需要更长的时间和临时磁盘空间。您可以在改进索引时间时将此参数设置为 false,但如果 mergeFactor 也 较大,则可能会耗尽文件描述符。

布尔值参数,使用 truefalse。这个选项的默认值为 true

true

hibernate.search.​enable_dirty_check

并非所有实体更改都需要 Lucene 索引更新。如果没有索引所有更新的实体属性(脏属性),Hibernate Search 将跳过重新索引的过程。

如果您使用需要在每次更新事件中调用的自定义 FieldBridges (即使没有更改该字段桥接的属性),请禁用这个选项。

此优化不应用于使用 @ClassBridge 或 @ DynamicBoost 的类。

布尔值参数,使用 truefalse。这个选项的默认值为 true

true

警告

黑色后端 不应在生产环境中使用,而是仅作为识别索引瓶颈的工具。

7.2.5.2. Lucene IndexWriter

有几个低级别 IndexWriter 设置可以针对不同的用例进行调整。这些参数按照 indexwriter 关键字分组:

default.<indexname>.indexwriter.<parameter_name>

如果没有在分片配置中为 indexwriter 设置值,Hibernate Search 会查看 index 部分,然后查看 default 部分。

7.2.5.3. 性能选项配置

以下配置将导致这些设置应用到 Animal 索引的第二个分片中

性能选项配置示例

default.Animals.2.indexwriter.max_merge_docs = 10
default.Animals.2.indexwriter.merge_factor = 20
default.Animals.2.indexwriter.term_index_interval = default
default.indexwriter.max_merge_docs = 100
default.indexwriter.ram_buffer_size = 64

  • max_merge_docs = 10
  • merge_factor = 20
  • ram_buffer_size = 64MB
  • term_index_interval = Lucene default

所有其他值将使用 Lucene 中定义的默认值。

Lucene 默认值是 Hibernate Search 的默认设置。因此,下表中列出的值取决于所使用的 Lucene 版本。显示的值相对于版本 2.4。有关 Lucene 索引性能的更多信息,请参阅 Lucene 文档。

注意

后端始终使用相同的设置执行工作。

Expand
表 7.5. 索引性能和行为属性
属性描述默认值

default.<indexname>.exclusive_index_use

当其他进程不需要写入同一索引时,设置为 true。这可让 Hibernate 搜索在索引上以独占模式工作,并在写入索引更改时提高性能。

True (提高性能,仅在关机时发布锁定)

default.<indexname>.max_queue_length

每个索引都有一个单独的"pipeline",其中包含要应用到索引的更新。当此队列满时,向队列添加更多操作将变为阻止操作。除非 worker.execution 配置为 async,否则配置此设置没有太大意义。

1000

default.<indexname>.indexwriter.max_buffered_delete_terms

确定应用和清空缓冲区内删除术语前所需的最小删除术语数量。如果当时内存中有被缓冲的文档,则它们会被合并并创建新的网段。

禁用(按 RAM 使用情况清空)

default.<indexname>.indexwriter.max_buffered_docs

控制索引期间内存中缓冲的文档数量。消耗的 RAM 量越大。

禁用(按 RAM 使用情况清空)

default.<indexname>.indexwriter.max_merge_docs

定义片段中允许的最大文件数。较小的值在经常更改索引时表现更好,如果索引不经常改变,更大的值可以提供更好的搜索性能。

无限(Integer.MAX_VALUE)

default.<indexname>.indexwriter.merge_factor

控制片段合并频率和大小。

确定插入时段索引的合并频率。使用较小的值时,索引和搜索未优化索引时会使用较少的 RAM,但索引速度较慢。当值较大时,索引期间会使用更多的 RAM,而搜索未优化索引时速度较慢,索引速度也更快。因此,较大的值(> 10)最适合创建批处理索引,更适合以互动方式维护的索引的更小的值(< 10)。该值不能低于 2。

10

default.<indexname>.indexwriter.merge_min_size

控制片段合并频率和大小。

在下一个片段合并操作中始终考虑小于这个大小的片段(以 MB 为单位)。

设置这个太大可能会导致合并操作昂贵,即使它们的频率较低。

See also org.apache.lucene.index.LogDocMergePolicy.minMergeSize.

0 MB(实际为 ~1K)

default.<indexname>.indexwriter.merge_max_size

控制片段合并频率和大小。

大于这个大小的片段(以 MB 为单位)永远不会合并到更大的网段。

这有助于降低内存要求并避免以最佳搜索速度为代价进行一些合并操作。在优化索引时,这个值将被忽略。

See also org.apache.lucene.index.LogDocMergePolicy.maxMergeSize.

无限

default.<indexname>.indexwriter.merge_max_optimize_size

控制片段合并频率和大小。

即使优化索引,大于这个大小的片段(以 MB 为单位)也不会合并(请参阅 merge_max_size 设置)。

应用到 org.apache.lucene.index.LogDocMergePolicy.maxMergeSizeForOptimize.

无限

default.<indexname>.indexwriter.merge_calibrate_by_deletes

控制片段合并频率和大小。

设置为 false,在估算合并策略时不考虑删除的文档。

应用到 org.apache.lucene.index.LogMergePolicy.calibrateSizeByDeletes.

true

default.<indexname>.indexwriter.ram_buffer_size

控制专用于文档缓冲区的 RAM 量(以 MB 为单位)。在一起使用 max_buffered_docs 时,会首先进行刷新(以此类事件为准)。

通常,为了提高索引性能,最好使用 RAM 刷新,而不是按文档计数进行清除,并使用尽可能大的 RAM 缓冲区。

16 MB

default.<indexname>.indexwriter.term_index_interval

设置索引术语之间的间隔。

较大的值会导致 IndexReader 使用的内存减少,但术语随机访问速度较慢。小的值可让 IndexReader 使用更多内存,并加快术语随机访问的速度。详情请查看 Lucene 文档。

128

default.<indexname>.indexwriter.use_compound_file

使用复合文件格式的优点是使用较少的文件描述符。缺点是索引需要更长的时间和临时磁盘空间。您可以在改进索引时间时将此参数设置为 false,但如果 mergeFactor 也 较大,则可能会耗尽文件描述符。

布尔值参数,使用 truefalse。这个选项的默认值为 true

true

default.enable_dirty_check

并非所有实体更改都需要 Lucene 索引更新。如果没有索引所有更新的实体属性(脏属性),Hibernate Search 将跳过重新索引的过程。

如果您使用需要在每次更新事件中调用的自定义 FieldBridges (即使没有更改该字段桥接的属性),请禁用这个选项。

此优化不应用于使用 @ClassBridge 或 @ DynamicBoost 的类。

布尔值参数,使用 truefalse。这个选项的默认值为 true

true

7.2.5.4. 调整索引速度

架构允许时,保留 default.exclusive_index_use=true,以提高索引写入效率。

在调优索引速度时,推荐的方法首先侧重于优化对象加载,然后使用您实现的计时来调整索引过程。将 黑色设置为 worker 后端,并启动索引例程。此后端不禁用 Hibernate 搜索。它将生成必要的更改集到索引,但丢弃它们而不是将它们清空到索引。与将 hibernate.search.indexing_strategy 设置为 manual 不同,使用 黑色可能会从数据库中加载更多数据,因为相关实体也会 重新索引。

hibernate.search.[default|<indexname>].worker.backend blackhole
警告

黑色后端 不会在生产环境中使用,而是作为识别索引瓶颈的诊断工具。

7.2.5.5. 控制分段大小

以下选项配置所创建的片段的最大大小:

  • merge_max_size
  • merge_max_optimize_size
  • merge_calibrate_by_deletes

控制分段大小

//to be fairly confident no files grow above 15MB, use:
hibernate.search.default.indexwriter.ram_buffer_size = 10
hibernate.search.default.indexwriter.merge_max_optimize_size = 7
hibernate.search.default.indexwriter.merge_max_size = 7

将合并操作的 max_size 设置为硬限制段大小小于一半,因为合并片段将两个片段合并为一个更大的片段。

新网段最初可能比预期大小更大,但创建网段永远不会显著大于 ram_buffer_size。将此阈值检查为估计值。

7.2.6. LockFactory 配置

Lucene Directory 可通过 LockingFactory(通过 Hibernate Search 管理的每个索引的 LockingFactory )进行配置。

有些锁定策略需要文件系统级别锁定,并可用于基于 RAM 的索引。在使用此策略时,必须指定 IndexBase 配置选项以指向存储锁定标记文件的文件系统位置。

要选择一个锁定工厂,将 hibernate.search.<index>.locking_strategy 选项设置为以下选项:

  • simple
  • native
  • none
Expand
表 7.6. 可用 LockFactory 实施列表
Nameclass描述

LockFactory 配置 简单

org.apache.lucene.store.​SimpleFSLockFactory

基于 Java File API 的安全实施,它通过创建标志文件来标记索引的使用。

如果出于某种原因您必须终止应用程序,则需要先删除此文件,然后才能将其重新启动。

native

org.apache.lucene.store.​NativeFSLockFactory

就像 简单 一样,这也通过创建标志文件来标记索引的使用,但是,这个文件使用原生操作系统文件锁定,因此即使 JVM 被终止,也会清理锁。

这种实施在 NFS 上存在已知问题,避免在网络共享中产生问题。

原生文件系统、文件系统 主机和文件系统从 目录 提供程序的默认实施。

org.apache.lucene.store.​SingleInstanceLockFactory

此 LockFactory 不使用文件标记,而是内存中保留的对象锁定;因此,仅当您确定索引不会由任何其他进程共享时,才可以使用它。

这是 ram 目录提供程序的默认实施。

none

org.apache.lucene.store.​NoLockFactory

对此索引的更改不会通过锁定协调。

以下是锁定策略配置示例:

hibernate.search.default.locking_strategy = simple
hibernate.search.Animals.locking_strategy = native
hibernate.search.Books.locking_strategy = org.custom.components.MyLockingFactory

7.2.7. 索引格式兼容性

Hibernate Search 目前不提供向后兼容 API 或工具来协助将应用程序移植到较新版本。API 使用 Apache Lucene 编写和搜索索引。有时可能需要更新索引格式。在这种情况下,如果 Lucene 无法读取旧格式,则可能需要重新索引数据。

警告

在尝试更新索引格式前备份索引。

Hibernate Search 公开 hibernate.search.lucene_version 配置属性。此属性指示 Analyzers 和其他 Lucene 类遵守旧版 Lucene 中定义的行为。另请参见 lu cene-core.jar 中包含的 org.apache.lucene.util. Version。如果未指定 选项,Hibernate Search 会指示 Lucene 使用版本默认值。建议在配置中明确定义使用的版本,以防止在升级发生时自动更改。升级后,可以根据需要明确更新配置值。

强制 Analyzers 与创建 Lucene 3.0 创建的索引兼容

hibernate.search.lucene_version = LUCENE_30

配置的 SearchFactory 是全局的,会影响包含相关参数的所有 Lucene API。如果使用 Lucene 并且 Hibernate Search 被绕过,请对其应用相同的值,以获得一致的结果。

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2026 Red Hat
返回顶部