Red Hat Training

A Red Hat training course is available for Red Hat JBoss Enterprise Application Platform

14.4.3.2. MassIndexer の使用

Hibernate Search の MassIndexer は、複数の並列スレッドを使用してインデックスを再ビルドします。オプションで、リロードする必要のあるエンティティーを選択するか、またはすべてのエンティティーのインデックスを変更できます。このアプローチは、パフォーマンスを最大化するために最適化されていますが、アプリケーションをメンテナンスモードに設定する必要があります。MassIndexer がビジーな場合、インデックスのクエリーは推奨されません。

例14.65 MassIndexer を使用してインデックスを再構築する

fullTextSession.createIndexer().startAndWait();
これにより、インデックスが再構築され、インデックスが削除されてから、データベースからすべてのエンティティーが再読み込みされます。簡単に使用できますが、プロセスのスピードを上げるために調整を行うことが推奨されます。
警告
MassIndexer の進行中は、インデックスの内容未定義になります。MassIndexer が機能している間にクエリーを実行すると、一部の結果が失われる可能性が高くなります。

例14.66 調整された MassIndexer の使用

fullTextSession
 .createIndexer( User.class )
 .batchSizeToLoadObjects( 25 )
 .cacheMode( CacheMode.NORMAL )
 .threadsToLoadObjects( 12 )
 .idFetchSize( 150 )
 .progressMonitor( monitor ) //a MassIndexerProgressMonitor implementation
 .startAndWait();
これにより、すべての User インスタンス (およびフラグ) のインデックスが再構築され、クエリーごとに 25 個のオブジェクトのバッチを使用して User インスタンスをロードするために、12 個の並列スレッドが作成されます。また、これら 12 個のスレッドが Lucene ドキュメントを出力するには、インデックス化された埋め込み関係およびカスタム FieldBridge または ClassBridge を処理する必要もあります。スレッドは、変換プロセス中に追加属性のレイジーローディングをトリガーします。そのため、並行して機能しているスレッドは多く必要になります。実際のインデックス書き込みで稼働しているスレッドの数は、各インデックスのバックエンド設定によって定義されます。
Cachemode を CacheMode.IGNORE (デフォルト) のままにすることが推奨されます。これは、ほとんどの場合でキャッシュが不要な追加オーバーヘッドになるためです。メインのエンティティーがインデックスに含まれる列挙のようなデータに関連する場合は、パフォーマンスを向上させる可能性があるため、データに応じて他の CacheMode を有効にすると便利です。
注記
最適なパフォーマンスを実現するために理想的なスレッド数は、全体的なアーキテクチャー、データベース設計、およびデータ値によって大きく異なります。すべての内部スレッドグループには意味のある名前が付けられているため、スレッドダンプ多くのの診断ツールで簡単に識別できます。
注記
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 を使用して同様の効果を得ることができます。
すべての .indexwriter パラメーターは Lucene 固有で、Hibernate Search はこれらのパラメーターを渡します。
MassIndexer は、前方のみのスクロール可能な結果を使用して、読み込まれるプライマリーキーを繰り返し処理しますが、MySQL の JDBC ドライバーはメモリーのすべての値を読み込みます。この「最適化」を回避するには、idFetchSizeInteger.MIN_VALUE に設定します。