Red Hat Training

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

14.4.3. インデックスの再構築

エンティティーマッピングをインデックスに変更する場合は、インデックス全体を更新する必要があります。たとえば、別のアナライザーを使用して既存のフィールドにインデックスを付ける場合は、影響を受けるタイプのインデックスを再構築する必要があります。また、データベースが置き換えられた場合 (バックアップから復元した場合や、レガシーシステムからインポートした場合など) は、既存データからインデックスを再構築できます。Hibernate Search は以下から選択する主要なストラテジーを提供します。
  • FullTextSession を使用します。flushToIndexes()FullTextSession を使用している間、定期的に。index()すべてのエンティティーで。
  • MassIndexer を使用。

14.4.3.1. FlushToIndexes() の使用

このストラテジーは、既存のインデックスを削除してから、FullTextSession.purgeAll() および FullTextSession.index() を使用してすべてのエンティティーをインデックスに戻すことで構成されますが、メモリーと効率の制約があります。効率を最大限に高めるためにも、Hibernate Search はインデックス操作をバッチ処理し、コミット時に実行します。大量のデータをインデックス化する場合は、トランザクションがコミットされるまですべてのドキュメントがキューに保存されるため、メモリー消費について注意する必要があります。キューを定期的に空にしないと、OutOfMemoryException が発生する可能性があります。この使用を行うにはfullTextSession.flushToIndexes()。毎回fullTextSession.flushToIndexes()が呼び出されると (またはトランザクションがコミットされた場合)、バッチキューが処理され、すべてのインデックス変更が適用されます。フラッシュ後は、変更をロールバックできないことに注意してください。

例14.64 index() および flushToIndexes() を使用したインデックス再構築

fullTextSession.setFlushMode(FlushMode.MANUAL);
fullTextSession.setCacheMode(CacheMode.IGNORE);
transaction = fullTextSession.beginTransaction();
//Scrollable results will avoid loading too many objects in memory
ScrollableResults results = fullTextSession.createCriteria( Email.class )
    .setFetchSize(BATCH_SIZE)
    .scroll( ScrollMode.FORWARD_ONLY );
int index = 0;
while( results.next() ) {
    index++;
    fullTextSession.index( results.get(0) ); //index each element
    if (index % BATCH_SIZE == 0) {
        fullTextSession.flushToIndexes(); //apply changes to indexes
        fullTextSession.clear(); //free memory since the queue is processed
    }
}
transaction.commit();
注記
この明示的な API が優先され、より優れた制御が提供されるため、hibernate.search.default.worker.batch_size が非推奨となりました。
アプリケーションがメモリーが不足しないように、バッチサイズを使用するようにしてください.大規模なバッチサイズオブジェクトの方がデータベースより高速ですが、より多くのメモリーが必要になります。