第2章 アーキテクチャ
2.1. 概要 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Hibernate Search はインデックス化コンポーネントとインデックス検索コンポーネントで構成されます。 いずれも Apache Lucene で支えられています。
エンティティがデータベースに対して挿入、更新または削除されるたびに、Hibernate Search はこのイベントを (Hibernate イベントシステムを使用して) 追跡し、インデックス更新をスケジュールします。すべてのインデックス更新は Apache Lucene API を使用せずに処理されます (「Hibernate Search および自動インデックスを有効化」 を参照)。
Apache Lucene のインデックスと交信するために、 Hibernate Search には
DirectoryProvider
に関する概念があります。 ディレクトリプロバイダは特定の Lucene Directory
タイプを管理します。 ディレクトリプロバイダを設定してディレクトリターゲットを調整することができます (「Directory 構成」 を参照)。
また、Hibernate Search は Lucene インデックスを使用してエンティティを検索し管理エンティティのリストを返すのでめんどうなオブジェクトと Lucene ドキュメントのマッピングを行わなくてすみます。 同じ永続コンテキストは Hibernate と Hibernate Search で共有されます。実際には、
FullTextSession
は Hibernate Session 上に構築されるため、アプリケーションコードは統一された org.hibernate.Query
または javax.persistence.Query
を HQL、JPA-QL、 またはネイティブのクエリが行うのと全く同じ方法で使用できます。
効率を上げるために、Hibernate Search は、Lucene インデックスとの書き込み対話をバッチ処理します。期待される範囲に応じて 2 つのバッチ処理タイプが存在します。トランザクション外で、実際のデータベース操作の直後にインデックス更新操作が実行されます。この範囲は実際には設定されず、バッチ処理も実行されません。ただし、データベースと Hibernate Search のいずれの場合でもトランザクション内でオペレーションを実行することをお勧めします (JDBC または JTA)。 トランザクション内の場合、 インデックス更新操作はトランザクションのコミットフェーズに対してスケジュールされ、トランザクションがロールバックする場合は破棄されます。バッチ処理範囲はトランザクションです。以下の 2 つの即時的な利点があります。
- パフォーマンス: バッチで操作を実行したとき Lucene のインデックス化は向上します。
- ACIDity: 実行される作業はデータベーストランザクションにより実行される作業と同じ範囲を持ち、トランザクションがコミットされた場合にのみ実行されます。これは、厳密には ACID ではありませんが、ACID の動作は完全テキスト検索インデックスにはほとんど役に立ちません (インデックスをソースからいつでも再構築できるため)。
これら 2 つの範囲は (有名な) オートコミットとトランザクション動作の関係と同じと考えることができます (範囲なしとトランザクション)。パフォーマンスの観点からは、トランザクションモードが推奨されます。範囲の選択は透過的に行われます。Hibernate Search はトランザクションの存在を検出し、範囲を調整します。
注記
Hibernate Search は Hibernate/EntityManager の長い会話 (アトミック会話) で適切に動作します。また、ユーザーの要求に応じて、範囲の追加が考慮されます (接続可能メカニズムがすでに動作)。