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
が非推奨となりました。
アプリケーションがメモリーが不足しないように、バッチサイズを使用するようにしてください.大規模なバッチサイズオブジェクトの方がデータベースより高速ですが、より多くのメモリーが必要になります。