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

Hibernate Search では、基礎となる Lucene IndexWriter に渡されるパラメータセット (mergeFactormaxMergeDocsmaxBufferedDocs など) を指定することにより Lucene インデックス化のパフォーマンスをチューニングできます。これらのパラメータは、すべてのインデックスに適用するデフォルト値、1 つのインデックごとのデフォルト値、または 1 つの分割ごとのデフォルト値として指定できます。
使用状況に応じて異なるパフォーマンス設定に対して使用できる 2 つのパラメータセットが存在します。データベース変更によりトリガされたインデックス化操作の間に、パラメータは transaction キーワードによりグループ化されます。
hibernate.search.[default|<indexname>].indexwriter.transaction.<parameter_name>
インデックス化が FullTextSession.index() (6章手動インデックス化 を参照) を使用して行われた場合、使用されるプロパティは batch キーワードによりグループ化されます。
hibernate.search.[default|<indexname>].indexwriter.batch.<parameter_name>
対応する .batch プロパティが明示的に設定されない限り、値はデフォルトで .transaction プロパティに設定されます。特定の分割設定の .batch 値に対して値が設定されない場合、Hibernate Search は最初にインデックスセクション、次にデフォルトセクションを参照し、その後以下の順序で .transaction を検索します。
hibernate.search.Animals.2.indexwriter.transaction.max_merge_docs 10
hibernate.search.Animals.2.indexwriter.transaction.merge_factor 20
hibernate.search.default.indexwriter.batch.max_merge_docs 100
この設定は、Animals インデックスの共有された 2 つ目のものに適用される設定になります。
  • transaction.max_merge_docs = 10
  • batch.max_merge_docs = 100
  • transaction.merge_factor = 20
  • batch.merge_factor = 20
他のすべての値は Lucene で定義されたデフォルト値を使用します。
すべての値のデフォルト値は Lucene の独自のデフォルト値のままになるため、以下のテーブルのリストされた値は使用する Lucene のバージョンに依存します。示された値はバージョン 2.4 に相対的です。Lucene インデックス化のパフォーマンスの詳細については、Lucene ドキュメンテーションを参照してください。

表3.3 インデックス化パフォーマンスと動作プロパティのリスト

プロパティ 説明 デフォルト値
hibernate.search.[default|<indexname>].indexwriter.[transaction|batch].max_buffered_delete_terms
バッファ化されたメモリ内の削除タームが適用され、フラッシュされる前に必要な削除タームの最小数を決定します。メモリ内にバッファ化されたドキュメントが存在する場合、ドキュメントはマージされ、新しいセグメントが作成されます。
無効 (RAM の使用によりフラッシュ)
hibernate.search.[default|<indexname>].indexwriter.[transaction|batch].max_buffered_docs
インデックス化の間にメモリ内にバッファ化されたドキュメントの量を制御します。量が多くなると、消費される RAM も多くなります。
無効 (RAM の使用によりフラッシュ)
hibernate.search.[default|<indexname>].indexwriter.[transaction|batch].max_field_length
1 つのフィールドに対してインデックス化するタームの最大数。これにより、インデックス化に必要なメモリ量が制限され、データが非常に大きい場合にメモリ不足によりインデックス化プロセスがクラッシュしなくなります。この設定は、異なるタームの数ではなく稼働しているタームの数を参照します。
これにより大きいドキュメントが若干切り捨てられます (ドキュメントにあるすべてのタームがインデックスから除外されます)。ソースドキュメントが大きいことがわかっている場合は、期待されるサイズを収めることができるようこの値を十分に大きく設定してください。Integer.MAX_VALUE に設定した場合、唯一の制限はメモリです。ただし、OutOfMemoryError が発生します。
この値を transaction ではなく batch で設定する場合は、インデックス化モードに応じてインデックスの異なるデータ (および結果) を取得できます。
10000
hibernate.search.[default|<indexname>].indexwriter.[transaction|batch].max_merge_docs
セグメントで許可されるドキュメントの最大数を定義します。大きい値はバッチインデックス化と高速な検索に最適です。小さい値はトランザクションインデックス化に最適です。
無制限 (Integer.MAX_VALUE)
hibernate.search.[default|<indexname>].indexwriter.[transaction|batch].merge_factor
セグメントマージの頻度とサイズを制御します。
挿入が行われたときにセグメントインデックスをマージする頻度を決定します。値を小さくすると、インデックス化の間に使用される RAM の量が少なくなり、最適化されないインデックスの検索が高速になりますが、インデックス化の処理に時間がかかります。値を大きくすると、インデックス化の間に使用される RAM の量が多くなり、最適化されないインデックスの検索が低速になり、インデックス化が高速なります。したがって、バッチインデックス作成には大きい値 (> 10) が最適であり、対話的に保持するインデックスには小さい値 (< 10) が最適です。この値は 2 よりも小さくする必要があります。
10
hibernate.search.[default|<indexname>].indexwriter.[transaction|batch].ram_buffer_size
ドキュメントバッファ専用の RAM の量 (MB 単位) を制御します。max_buffered_docs とともに使用すると、最初に発生したイベントに対してフラッシュが実行されます。
一般的に、高速なインデックス化パフォーマンスを実現するには、ドキュメント数の代わりに RAM の使用量によりフラッシュし、できるだけ大きい RAM バッファを使用することが最適です。
16 MB
hibernate.search.[default|<indexname>].indexwriter.[transaction|batch].term_index_interval
上級者向け: インデックス化されたターム間の間隔を設定します。
値を大きくすると、IndexReader により使用されるメモリ量は小さくなりますが、タームへのランダムアクセスが低速になります。値を小さくすると、IndexReader により使用されるメモリ量は大きくなり、タームへのランダムアクセスが高速になります。詳細については、Lucene ドキュメンテーションを参照してください。
128
hibernate.search.[default|<indexname>].indexwriter.[transaction|batch].use_compound_file 複合ファイル形式を使用する利点は使用されるファイル記述子が少なくなることです。欠点はインデックス化に時間がかかり、より多くの一時ディスク領域が必要になることです。インデックス化の時間を短縮するために、このパラメータを false に設定できますが、mergeFactor も大きい場合は、ファイル記述子が足りなくなることがあります。
ブール値パラメータの場合は、"true" または "false" を使用します。このオプションのデフォルト値は true です。
true