7.2. Configuration (設定)

7.2.1. 最小設定

Hibernate Search は、設定および操作の柔軟性を提供するように設計されており、ほとんどのユースケースに合わせてデフォルト値を慎重に選択しています。少なくとも、Directory Provider とそのプロパティーを設定する必要があります。デフォルトの Directory Provider は filesystem で 、インデックスストレージにローカルファイルシステムを使用します。利用可能な Directory Providers およびその設定の詳細は、DirectoryProvider Configuration を参照してください。

Hibernate を直接使用する場合は、DirectoryProvider などの設定を、設定ファイル (hibernate.properties または hibernate.cfg.xml) で設定する必要があります。Jakarta Persistence 経由で Hibernate を使用している場合、設定ファイルは persistence.xml になります。

その他のリソース

7.2.2. IndexManager の設定

Hibernate Search は、このインターフェイスにいくつかの実装を提供します。

  • directory-based: Lucene Directory 抽象化を使用してインデックスファイルを管理するデフォルトの実装。
  • near-real-time: コミット時にディスクへの書き込みをフラッシュしないようにします。このインデックスマネージャーは Directory ベースでもありますが、Lucene のほぼリアルタイムの NRT 機能を使用します。

デフォルト以外の IndexManager を指定するには、以下のプロパティーを指定します。

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

7.2.2.1. Directory-based

Directory-based 実装はデフォルトの IndexManager 実装です。これは高度な設定が可能で、リーダーストラテジー、バックエンド、およびディレクトリープロバイダーに個別の設定を可能にします。

7.2.2.2. Near Real Time

NRTIndexManager はデフォルトの IndexManager の拡張機能で、低レイテンシーインデックス書き込みに Lucene NRT、Near Real Time 機能を活用します。ただし、lucene 以外の代替のバックエンドの設定を無視し、Directory で排他的な書き込みロックを取得します。

IndexWriter は、低レイテンシーを提供するため、ディスクへの変更をすべてフラッシュしません。クエリーは、フラッシュされていないインデックスライターバッファーから更新された状態を読み取ることができます。ただし、これは、IndexWriter が強制終了したり、アプリケーションがクラッシュした場合に、インデックスを再構築する必要があるように更新が失われる可能性があることを意味します。

Near Real Time 設定は、上記のデメリットとマスターノードを個別に設定できるため、データが限定されたクラスター化されていない Web サイトに対して推奨されます。

7.2.2.3. Custom

カスタム実装の完全修飾クラス名を指定して、カスタマイズされた IndexManager を設定します。以下のように、実装に no-argument コンストラクターを設定します。

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

カスタムインデックスマネージャーの実装には、デフォルトの実装と同じコンポーネントは必要ありません。たとえば、Directory インターフェイスを公開しないリモートインデックスサービスに委譲します 。

7.2.3. DirectoryProvider の設定

DirectoryProvider は Lucene Directory に関する Hibernate Search の抽象化で、基盤の Lucene リソースの設定および初期化を処理します。Directory Providers and Their Properties では Hibernate Search で利用可能なディレクトリープロバイダーの一覧と、対応するオプションを表示しています。

インデックス化された各エンティティーは Lucene インデックスに関連付けられます (複数のエンティティーが同じインデックスを共有している場合を除きます)。インデックスの名前は、@Indexed アノテーションの index プロパティーによって指定されます。Index プロパティーが指定されていない場合は、インデックスされたクラスの完全修飾名が名前として使用されます (推奨)。

DirectoryProvider および追加オプションは、接頭辞 hibernate.search.<indexname> を使用して設定できます。名前 default (hibernate.search.default) は予約されており、すべてのインデックスに適用されるプロパティーを定義するために使用できます。Configuring Directory Providers では、hibernate.search.default.directory_provider を使用してデフォルトのディレクトリープロバイダーをファイルシステムに設定する方法を示しています。その後に、hibernate.search.default.indexBase がインデックスのデフォルトのベースディレクトリーを設定します。その結果、エンティティー Status のインデックスが /usr/lucene/indexes/org.hibernate.example.Status に作成されます。

ただし、Rule エンティティーのインデックスは、メモリー内ディレクトリーを使用します。これは、このエンティティーのデフォルトのディレクトリープロバイダーが 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
None
Filesystem

ファイルシステムベースのディレクトリー使用されるディレクトリーは <indexBase> /< indexName > です。

  • indexBase: ベースディレクトリー
  • indexName: @Indexed.index を上書き (シャード化されたインデックスに便利です)
  • locking_strategy: オプション。LockFactory Configuration を参照してください。
  • filesystem_access_type: この DirectoryProvider で使用される FSDirectory 実装の正確なタイプを判別できます。許可される値は auto (デフォルト値。Windows 以外のシステムでは NIOFSDirectory、Windwos では SimpleFSDirectory)、simple (SimpleFSDirectory)nio (NIOFSDirectory)mmap (MMapDirectory) を選択します。この設定を変更する前に、これらのディレクトリー実装に関する Java ドキュメントを参照してください。NIOFSDirectory または MMapDirectory は、パフォーマンスを大幅に向上させる可能性がありますが、問題もあります。
filesystem-master

ファイルシステムベースのディレクトリーfilesystem と類似しています。また、定期的にインデックスをソースディレクトリー (コピーディレクトリー) にコピーします。

更新期間に推奨される値は (最低 50%)、情報をコピーする時間 (デフォルトは 3600 秒 - 60 分) です。

コピーは、増分コピーメカニズムをベースにしているため、コピーの平均時間が短縮されることに注意してください。

DirectoryProvider は通常、Jakarta Messaging バックエンドクラスターのマスターノードで使用されます。

buffer_size_on_copy 最適化は、ご使用のオペレーティングシステムと利用可能な RAM によって異なります。多くユーザーは 16 から 64MB までの値を使用して良好な結果を報告しています。

  • indexBase: ベースディレクトリー
  • indexName: @Indexed.index を上書き (シャード化されたインデックスに便利です)
  • sourceBase: ソース (コピー) のベースディレクトリー。
  • source: ソースディレクトリーの接尾辞 (デフォルトは @Indexed.index)。実際のソースのディレクトリー名は <sourceBase>/<source> です。
  • refresh: 更新の間隔 (秒単位) です (コピーは更新の秒数ごとに行われます)。次の refresh 期間が経過してもコピーが進行中であると、次のコピー操作はスキップされます。
  • buffer_size_on_copy: 単一の低レベルのコピー命令で移動するメガージの量。デフォルトは 16MB です。
  • locking_strategy: オプション。LockFactory Configuration を参照してください。
  • filesystem_access_type: この DirectoryProvider で使用される FSDirectory 実装の正確なタイプを判別できます。許可される値は auto (デフォルト値。Windows 以外のシステムでは NIOFSDirectory、Windwos では SimpleFSDirectory)、simple (SimpleFSDirectory)nio (NIOFSDirectory)mmap (MMapDirectory) を選択します。この設定を変更する前に、これらのディレクトリー実装に関する Java ドキュメントを参照してください。NIOFSDirectory または MMapDirectory ではパフォーマンスが大幅に向上しますが、注意が必要な問題もあります。
filesystem-slave

ファイルシステムベースのディレクトリーfilesystem と似ていますが、マスターバージョン (ソース) を定期的に取得します。ロックおよび一貫性のない検索結果を避けるため、2 つのローカルコピーが維持されます。

更新期間に推奨される値は (最低 50%)、情報をコピーする時間 (デフォルトは 3600 秒 - 60 分) です。

コピーは、増分コピーメカニズムをベースにしているため、コピーの平均時間が短縮されることに注意してください。refresh 期間が経過してもコピーが進行中であると、次のコピー操作はスキップされます。

DirectoryProvider は通常、Jakarta Messaging バックエンドを使用するスレーブノードに使用されます。

buffer_size_on_copy 最適化は、ご使用のオペレーティングシステムと利用可能な RAM によって異なります。多くユーザーは 16 から 64MB までの値を使用して良好な結果を報告しています。

  • indexBase: ベースディレクトリー
  • indexName: @Indexed.index を上書き (シャード化されたインデックスに便利です)
  • sourceBase: ソース (コピー) のベースディレクトリー。
  • source: ソースディレクトリーの接尾辞 (デフォルトは @Indexed.index)。実際のソースのディレクトリー名は <sourceBase>/<source> です。
  • refresh: 更新の間隔 (秒単位) です (コピーは更新の秒数ごとに行われます)。
  • buffer_size_on_copy: 単一の低レベルのコピー命令で移動するメガージの量。デフォルトは 16MB です。
  • locking_strategy: オプション。LockFactory Configuration を参照してください。
  • retry_marker_lookup: オプションで、デフォルトは 0 です。Hibernate Search がソースディレクトリーのマーカーファイルをチェックする回数を定義します。試行ごとに 5 秒待機します。
  • retry_initialize_period: オプション。再試行初期化機能を有効にするために整数値を秒単位で設定します。スレーブがマスターインデックスを検出できない場合、アプリケーションがバックグラウンドで起動しないようにせずに再試行します。インデックスの初期化前に実行された FULLTEXT クエリーはブロックされず、空の結果が返されます。オプションを有効にしない、または明示的にゼロに設定すると、再試行タイマーのスケジュール設定ではなく、例外により失敗します。無効なインデックスなしでアプリケーションが起動しないようにし、初期化のタイムアウトを制御するには、代わりに retry_marker_lookup を参照してください。
  • filesystem_access_type: この DirectoryProvider で使用される FSDirectory 実装の正確なタイプを判別できます。許可される値は auto (デフォルト値。Windows 以外のシステムでは NIOFSDirectory、Windwos では SimpleFSDirectory)、simple (SimpleFSDirectory)nio (NIOFSDirectory)mmap (MMapDirectory) を選択します。この設定を変更する前に、これらのディレクトリー実装に関する Java ドキュメントを参照してください。NIOFSDirectory または MMapDirectory はパフォーマンスを大幅に向上させる可能性がありますが、問題にも認識する必要があります。
注記

ビルトインディレクトリープロバイダーがニーズに適さない場合は、org.hibernate.store.DirectoryProvider インターフェイスを実装して独自のディレクトリープロバイダーを作成することができます。この場合、プロバイダーの完全修飾クラス名を directory_provider プロパティーに渡します。接頭辞 hibernate.search.<indexname> を使用して追加のプロパティーを渡すことができます。

7.2.4. Worker 設定

workder 設定では、Hibernate Search が Lucene と対話する方法を詳細化することができます。複数のアーキテクチャーコンポーネントと可能な拡張ポイントが存在します。詳しく見てみましょう。

ワーカー設定を使用して、Infinispan クエリーが Lucene と対話する方法を詳細化します。この設定には、いくつかのアーキテクチャーコンポーネントおよび可能な拡張ポイントを使用できます。

まず、Worker があります。Worker インターフェイスの実装は、すべてのエンティティーの変更を受け取り、コンテキストによってそれらをキューに登録し、コンテキストの終了時に適用します。特に ORM との接続で最も直感的なコンテキストはトランザクションです。このため、はデフォルトで TransactionalWorker を使用してトランザクションごとにすべての変更をスコープします。ただし、エンティティーの変更数やその他のアプリケーションライフサイクルイベントなどによってコンテキストが異なるシナリオを想定できます。

表7.1 スコープの設定

プロパティー説明

hibernate.search.worker.scope

使用する Worker 実装の完全修飾クラス名。このプロパティーが設定されていない場合や、空または transaction の場合は、デフォルトの TransactionalWorker が使用されます。

hibernate.search.worker.*

接頭辞 hibernate.search.worker が付いたすべての設定プロパティーは初期化中にワーカーに渡されます。これにより、カスタムのワーカー固有のパラメーターを追加できます。

hibernate.search.worker.batch_size

コンテキストごとにバッチ処理されるインデックス操作の最大数を定義します。制限に達すると、コンテキストが終了していなくてもインデックスがトリガーされます。このプロパティーは、Worker 実装がキュー待ちの作業を BatchedQueueingProcessor (TransactionalWorker の動作) に委任する場合にのみ動作します。

コンテキストが終了すると、インデックスの変更を準備して適用します。これは、新規スレッド内で同期または非同期に実行できます。同期更新には、常にインデックスがデータベースと同期しているという利点があります。一方、非同期の更新は、ユーザーの応答時間を最小限に抑えるのに役立ちます。欠点は、データベースとインデックスの状態間で不一致が生じる可能性があることです。

注記

以下のオプションはインデックスごとに異なる場合があります。実際には、indexName 接頭辞が必要になるか、default を使用してすべてのインデックスのデフォルト値を設定する必要があります。

表7.2 実行設定

プロパティー説明

hibernate.search.<indexName>.worker.execution

sync: 同期実行 (デフォルト)

async: 非同期実行

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

バックエンドは、スレッドプールを使用して、同じトランザクションコンテキスト (またはバッチ) から更新を並行して適用することができます。デフォルト値は 1 です。トランザクションごとに多数の操作がある場合は、大きな値を試すことができます。

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

スレッドプールが不足している場合は、ワークキューの最大数を定義します。非同期実行のみに便利です。デフォルトは infinite です。制限に達すると、ワークはメインスレッドによって行われます。

現在、いずれの実行モードであっても、すべての作業は同じ仮想マシン内で行われます。単一仮想マシンの作業合計量は変更されていません。常に、より適切なアプローチ (つまり委任) があります。hibernate.search.default.worker.backend を設定すると、インデックス作業を別のサーバーに送信できます。このオプションも、インデックスごとに異なる方法で設定できます。

表7.3 バックエンドの設定

プロパティー説明

hibernate.search.<indexName>.worker.backend

lucene: 同じ仮想マシンでインデックスを更新するデフォルトのバックエンド。プロパティーが定義されていないか、空の場合に使用されます。

jms: Java Messaging Service バックエンド。インデックスの更新は Java Messaging Service キューに送信され、インデックスマスターによって処理されます。その他の設定オプションや、この設定の詳細は、 Java Messaging Service Back-end Configuration を参照してください。

BlackHole: 主にテスト/開発者の設定で、すべてのインデックス作業を無視します。

BackendQueueProcessor を実装するクラスの完全修飾名を指定することもできます。これにより、独自の通信層を実装することができます。この実装は、実行時にインデックスワークを処理する Runnable インスタンスを返します。

  1. Java Messaging サービスのバックエンド設定

プロパティー

説明

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

必要に応じて InitialContext を開始する Java Naming および Directory Interface プロパティーを定義します。Java Naming and Directory Interface は、Java Messaging サービスのバックエンドによってのみ使用されます。

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

Java Messaging Service バックエンドには必須です。Java Messaging Service 接続ファクトリーを (Red Hat JBoss Enterprise Application Platform のデフォルトでは /ConnectionFactory) から検索する Java Naming および Directory Interface 名を定義します。

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

Java Messaging Service バックエンドには必須です。Java Messaging Service キューを検索する Java Naming and Directory Interface 名を定義します。キューはワークメッセージをポストするために使用されます。

警告

おそらく、表示されるプロパティーの一部は関連付けられるため、プロパティー値のすべての組み合わせが適切であるとは限りません。実際には、機能以外の設定を行うことができます。これは、特に、ここに示されるインターフェイスの独自の実装を提供する場合が該当します。独自の Worker または BackendQueueProcessor 実装を作成する前に、既存のコードを調査してください。

7.2.4.1. Jakarta Messaging マスター/スレーブバックエンド

このセクションでは、マスター/スレーブの Hibernate Search アーキテクチャーの設定方法について説明します。

図7.3 Jakarta Messaging バックエンドの設定

Jakarta Messaging Service Backend Configuration

7.2.4.2. スレーブノード

すべてのインデックス更新操作は Jakarta Messaging キューに送信されます。インデックスクエリー操作は、ローカルインデックスコピーで実行されます。

Jakarta Messaging スレーブの設定

### 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. マスターノード

すべてのインデックス更新操作は Jakarta Messaging キューから取得され、実行されます。マスターインデックスは定期的にコピーされます。

Jakarta Messaging キューのインデックス更新操作は実行され、マスターインデックスは定期的にコピーされます。

Jakarta Messaging Service Master 設定

### 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 フレームワークの設定に加えて、Jakarta Messaging を介してインデックスを処理するようメッセージ駆動 Bean を作成し、設定する必要があります。

メッセージ駆動型 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 Messaging コントローラークラスから継承し、Jakarta EE MDB を実装します。この実装は例として提供されており、Jakarta EE 以外のメッセージ駆動 Bean を利用するように調整できます。

7.2.5. Lucene インデックスのチューニング

7.2.5.1. Lucene インデックスのパフォーマンスチューニング

Hibernate Search は、mergeFactormaxMergeDocsmaxBufferedDocs など、基礎となる Lucene IndexWriter に渡される一連のパラメーターを指定することで Lucence インデクスパフォーマンスを調整するのに使用されます。これらのパラメーターは、インデックスベースまたはシャードごとに、すべてのインデックスに適用されるデフォルト値として指定します。

各種ユースケースに合わせて調整できる低レベルの IndexWriter 設定がいくつかあります。これらのパラメーターは、indexwriter キーワードでグループ化されます。

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

特定のシャード設定の indexwriter 値に値が設定されていないと、Hibernate Search は index セクションをチェックしてから default セクションをチェックします。

以下の表の設定により、Animal インデックスの 2 つ目のシャードにこれらの設定が適用されます。

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

他のすべての値は、Lucene で定義されたデフォルトを使用します。

デフォルトでは、すべての値は Lucene の独自のデフォルトのままにします。Indexing Performance and Behavior Properties に一覧表示される値は、使用している Lucene のバージョンに応じて異なります。上記の値はバージョン 2.4 に相対的です。

注記

Hibernate Search の以前のバージョンには batch および transaction プロパティーの概念がありました。バックエンドは常に同じ設定を使用して機能するため、これは変わりました。

表7.4 パフォーマンスおよび動作プロパティーのインデックス作成

プロパティー説明デフォルト値

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

他のプロセスが同じインデックスに書き込む必要がない場合は true に設定します。これにより、Hibernate Search がインデックスの排他モードで動作し、インデックスへの変更を書き込む際にパフォーマンスが向上します。

true (パフォーマンスの向上、シャットダウン時のみロックされる)

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

各インデックスには、インデックスに適用される更新が含まれる個別の pipeline があります。このキューが満杯になると、ブロック操作になります。worker.executionasync として設定されていない限り、この設定の設定は意味がありません。

1000

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

バッファーインメモリー削除の条件が適用され、フラッシュされるまでに最低限必要な削除用語を決定します。時点でバッファーされたドキュメントがメモリーにある場合、ドキュメントはマージされ、新しいセグメントが作成されます。

Disabled (RAM 使用率によるフラッシュ)

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

インデックス作成中にメモリーでバッファーされたドキュメントの量を制御します。RAM が大きいほど消費されます。

Disabled (RAM 使用率によるフラッシュ)

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

セグメント内で許容されるドキュメントの最大数を定義します。値を小さくすると、頻繁に変更されるインデックスでのパフォーマンスが向上します。値を大きくすると、インデックスが頻繁に変更されない場合に検索パフォーマンスが向上します。

Unlimited (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 単位) は常に次のセグメントマージ操作の対象となります。このパラメーターを高く設定しすぎると、マージ操作が頻繁に行われない場合でも、処理にコストがかかる可能性があります。org.apache.lucene.index.LogDocMergePolicy.minMergeSize も参照してください。

0 MB (実際 ~1K)

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

セグメントマージの頻度とサイズを制御します。

このサイズより大きいセグメント (MB 単位) は、大きなセグメントにマージされることはありません。

これにより、メモリー要件が減り、一部のマージ操作が最適な検索速度で回避されます。インデックスの最適化時にこの値は無視されます。

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 では使用されるメモリーが少なくなります。しかし、ランダムアクセスが遅くなります。値が小さいと、IndexReader の方がより多くのメモリーが使用され、用語へのランダムアクセスが速くなります。詳細は、Lucene ドキュメントを参照してください。

128

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

複合ファイル形式を使用すると、使用するファイル記述子が少なくなります。欠点は、インデックス作成にかかる時間と一時ディスク容量が多いことです。インデックス処理時間を短縮するために、このパラメーターを false に設定できますが、mergeFactor が大きくなるとファイル記述子が不足する可能性があります。

ブール値のパラメーター。true または false を使用します。このオプションのデフォルト値は true です。

true

hibernate.search.enable_dirty_check

すべてのエンティティーの変更に Lucene インデックスの更新が必要であるわけではありません。更新されたエンティティープロパティー (dirty プロパティー) すべてがインデックス化されない場合、Hibernate Search はインデックス変更プロセスを省略します。

各更新イベントで呼び出す必要があるカスタムの FieldBridges を使用する場合は、このオプションを無効にします (フィールドブリッジを設定するプロパティーに変更がありません)。

この最適化は、@ClassBridge または @DynamicBoost を使用するクラスには適用されません。

ブール値のパラメーター。true または false を使用します。このオプションのデフォルト値は true です。

true

警告

blackhole バックエンドは 、インデックスのボトルネックを特定するツールとしてのみ、実稼働環境で使用することは意図されていません。

7.2.5.2. Lucene IndexWriter

各種ユースケースに合わせて調整できる低レベルの IndexWriter 設定がいくつかあります。これらのパラメーターは、indexwriter キーワードでグループ化されます。

default.<indexname>.indexwriter.<parameter_name>

シャード設定で indexwriter の値が設定されていない場合、Hibernate Search は index セクションを参照し、デフォルトのセクションを探します。

7.2.5.3. パフォーマンスオプションの設定

以下の設定では、これらの設定が Animal インデックスの 2 つ目のシャードに適用されます。

パフォーマンスオプションの設定例

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 のドキュメントを参照してください。

注記

バックエンドは常に同じ設定を使用して動作します。

表7.5 パフォーマンスおよび動作プロパティーのインデックス作成

プロパティー説明デフォルト値

default.<indexname>.exclusive_index_use

他のプロセスが同じインデックスに書き込む必要がない場合は true に設定します。これにより、Hibernate Search がインデックスの排他モードで動作し、インデックスへの変更を書き込む際にパフォーマンスが向上します。

true (パフォーマンスの向上、シャットダウン時のみロックされる)

default.<indexname>.max_queue_length

各インデックスには、インデックスに適用される更新が含まれる個別の pipeline があります。このキューが満杯になると、ブロック操作になります。worker.executionasync として設定されていない限り、この設定の設定は意味がありません。

1000

default.<indexname>.indexwriter.max_buffered_delete_terms

バッファーインメモリー削除の条件が適用され、フラッシュされるまでに最低限必要な削除用語を決定します。時点でバッファーされたドキュメントがメモリーにある場合、ドキュメントはマージされ、新しいセグメントが作成されます。

Disabled (RAM 使用率によるフラッシュ)

default.<indexname>.indexwriter.max_buffered_docs

インデックス作成中にメモリーでバッファーされたドキュメントの量を制御します。RAM が大きいほど消費されます。

Disabled (RAM 使用率によるフラッシュ)

default.<indexname>.indexwriter.max_merge_docs

セグメント内で許容されるドキュメントの最大数を定義します。値を小さくすると、頻繁に変更されるインデックスでのパフォーマンスが向上します。値を大きくすると、インデックスが頻繁に変更されない場合に検索パフォーマンスが向上します。

Unlimited (Integer.MAX_VALUE)

default.<indexname>.indexwriter.merge_factor

セグメントマージの頻度とサイズを制御します。

挿入時にセグメントインデックスをマージする頻度を決定します。値を小さくすると、インデックス処理時に使用される RAM が少なくなり、最適化されていないインデックスの検索速度が速くなりますが、インデックスの速度は遅くなります。値が大きいと、インデックス時により多くの RAM が使用され、最適化されていないインデックスの検索速度が遅くなるため、インデックスがより速くなります。そのため、大きな値 (> 10) はバッチインデックスの作成に最も適しており、対話的に維持されるインデックスに小さい値 (< 10) が適しています。この値は 2 未満にしないでください。

10

default.<indexname>.indexwriter.merge_min_size

セグメントマージの頻度とサイズを制御します。

このサイズより小さいセグメント (MB 単位) は常に次のセグメントマージ操作の対象となります。

このパラメーターを高く設定しすぎると、マージ操作が頻繁に行われない場合でも、処理にコストがかかる可能性があります。

org.apache.lucene.index.LogDocMergePolicy.minMergeSize も参照してください。

0 MB (実際 ~1K)

default.<indexname>.indexwriter.merge_max_size

セグメントマージの頻度とサイズを制御します。

このサイズより大きいセグメント (MB 単位) は、大きなセグメントにマージされることはありません。

これにより、メモリー要件が減り、一部のマージ操作が最適な検索速度で回避されます。インデックスの最適化時にこの値は無視されます。

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 が大きくなるとファイル記述子が不足する可能性があります。

ブール値のパラメーター。true または false を使用します。このオプションのデフォルト値は true です。

true

default.enable_dirty_check

すべてのエンティティーの変更に Lucene インデックスの更新が必要であるわけではありません。更新されたエンティティープロパティー (dirty プロパティー) すべてがインデックス化されない場合、Hibernate Search はインデックス変更プロセスを省略します。

各更新イベントで呼び出す必要があるカスタムの FieldBridges を使用する場合は、このオプションを無効にします (フィールドブリッジを設定するプロパティーに変更がありません)。

この最適化は、@ClassBridge または @DynamicBoost を使用するクラスには適用されません。

ブール値のパラメーター。true または false を使用します。このオプションのデフォルト値は true です。

true

7.2.5.4. インデックス速度の調整

アーキテクチャーが許可する場合、インデックスの書き込み効率を向上させるために default.exclusive_index_use=true のままにします。

インデックスの速度を調整する場合は、最初にオブジェクトの読み込みの最適化に焦点を合わせ、次にインデックスプロセスのチューニングの基準として達成するタイミングを使用することが推奨されます。blackhole をワーカーバックエンドとして設定し、インデックスルーチンを開始します。このバックエンドは、Hibernate Search を無効にしません。インデックスに必要な変更セットが生成されますが、それらをインデックスにフラッシュするのではなく破棄します。hibernate.search.indexing_strategymanual に設定するのとは対照的に、blackhole を使用すると、関連するエンティティーも再インデックス化されるため、データベースがより多くのデータを読み込む可能性があります。

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

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

マージセグメントが 2 つの大きなセグメントに結合するため、マージ操作の max_size はハード制限セグメントサイズの半分未満に設定します。

新しいセグメントは、当初は予想よりも大きくなる場合がありますが、セグメントが ram_buffer_size よりも大きく作成されることは決してありません。このしきい値は予測としてチェックされます。

7.2.6. LockFactory 設定

Lucene ディレクトリーは、Hibernate Search によって管理される各インデックスの LockingFactory を介してカスタムロックストラテジーで設定できます。

一部のロックストラテジーには、ファイルシステムレベルのロックが必要で、RAM ベースのインデックスで使用できます。このストラテジーを使用する場合は、IndexBase 設定オプションを指定して、ロックマーカーファイルを保存するファイルシステムの場所を指定する必要があります。

ロックファクトリーを選択するには、hibernate.search.<index>.locking_strategy オプションを以下のオプションのいずれかに設定します。

  • ˆsimple
  • native
  • single
  • none

表7.6 利用可能な LockFactory 実装の一覧

名前クラス説明

LockFactory Configuration simple

org.apache.lucene.store.SimpleFSLockFactory

Java の File API に基づく安全な実装では、マーカーファイルを作成してインデックスの使用をマークします。

何らかの理由でアプリケーションを強制終了する必要がある場合には、このファイルを削除してから再起動する必要があります。

native

org.apache.lucene.store.NativeFSLockFactory

simple と同様に、マーカーファイルを作成してインデックスの使用をマークします。しかし、これはネイティブの OS ファイルロックを使用しているため、JVM が終了してもロックはクリーンアップされます。

この実装では、NFS で既知の問題があるため、ネットワーク共有で使用しないでください。

native は、filesystemfilesystem-masterfilesystem-slave ディレクトリープロバイダーのデフォルトの実装です。

single

org.apache.lucene.store.SingleInstanceLockFactory

この LockFactory はファイルマーカーを使用しませんが、メモリーに保持される Java オブジェクトロックであるため、インデックスが他のプロセスで共有されないことが確実な場合にのみ使用できます。

これは、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 設定プロパティーを公開します。このプロパティーは、古いバージョンの Lucene に定義されている動作に準拠するように Analyzers およびその他の Lucene クラスに指示します。lucene-core.jar に含まれる org.apache.lucene.util.Version も参照してください。このオプションを指定しないと、Hibernate Search はバージョンのデフォルトを使用するよう Lucene に指示します。使用されるバージョンは、アップグレード時に自動的に変更されないように設定に明示的に定義することが推奨されます。アップグレード後、必要に応じて設定値を明示的に更新できます。

Lucene 3.0 の Created Index と互換性を持たせるようにアナライザーを強制する

hibernate.search.lucene_version = LUCENE_30

設定した SearchFactory はグローバルであり、関連するパラメーターが含まれるすべての Lucene API に影響します。Lucene が使用され、Hibernate Search がバイパスされる場合には、一貫した結果を得るために同じ値を適用してください。