第6章 手動インデックス化


6.1. インデックス化

エンティティがデータベースに対して挿入または更新されない場合でもエンティティのインデックス化が役に立つ場合があります。 これは、たとえば、初めてインデックスを構築する場合に該当します。これは、FullTextSession.index() を使用して実行できます。

例6.1 FullTextSession.index() を使用したエンティティのインデックス化

FullTextSession fullTextSession = Search.getFullTextSession(session);
Transaction tx = fullTextSession.beginTransaction();
for (Customer customer : customers) {
    fullTextSession.index(customer);
}
tx.commit(); //index are written at commit time
Copy to Clipboard Toggle word wrap
効率を最大化するために、Hibernate Search はインデックス操作をバッチ処理し、コミット時に実行します。ただし、たくさんのデータをインデックス化する場合は、トランザクションのコミット時まですべてのドキュメントがキューに保持されるため、メモリ消費について気を付ける必要があります。OutOfMemoryException が発生することがあります。この例外を回避するには、fullTextSession.flushToIndexes() を使用します。fullTextSession.flushToIndexes() が呼び出されるたびに (または、トランザクションがコミットされる場合)、バッチキューが処理され (メモリが解放される) すべてのインデックスの変更が適用されます。破棄された変更はロールバックできないことに注意してください。

注記

hibernate.search.worker.batch_size は廃止され、より適切に制御できるこの明示的な API に取って代わりました。
インデックス化時間とメモリ消費に影響を与える可能性がある他のパラメータは以下のとおりです。
  • hibernate.search.[default|<indexname>].indexwriter.[batch|transaction].max_buffered_docs
  • hibernate.search.[default|<indexname>].indexwriter.[batch|transaction].max_field_length
  • hibernate.search.[default|<indexname>].indexwriter.[batch|transaction].max_merge_docs
  • hibernate.search.[default|<indexname>].indexwriter.[batch|transaction].merge_factor
  • hibernate.search.[default|<indexname>].indexwriter.[batch|transaction].ram_buffer_size
  • hibernate.search.[default|<indexname>].indexwriter.[batch|transaction].term_index_interval
これらのパラメータは Lucene 固有であり、 Hibernate Search はこれらのパラメータを単に渡します。詳細については、「Lucene インデックス化パフォーマンスのチューニング」 を参照してください。

例6.2 特定のクラスを効率的にインデックス化 (インデックスの (再) 初期化に有用)

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(); //clear since the queue is processed
    }
}
transaction.commit();
Copy to Clipboard Toggle word wrap
アプリケーションのメモリが足りなくならないバッチサイズをい使用してみてください。
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat