11.2. エントリー値のインデックス化
Data Grid のエントリー値をインデックス化すると、検索パフォーマンスが大幅に改善し、フルテキストクエリーを実行できるようになります。しかし、インデックス処理は、Data Grid クラスターの書き込みスループットを低下させる可能性があります。このため、キャッシュモードやユースケースに応じて、ストラテジーを使用してクエリーのパフォーマンスを最適化する計画を立てる必要があります。クエリーパフォーマンスガイド についての詳細
11.2.1. 設定
XML によるインデックス化を有効にするには、<indexing>
要素をキャッシュ設定に追加し、インデックス化されるエンティティーを指定し、オプションで追加のプロパティーを渡す必要があります。
enabled
属性のデフォルト値が XSD ス キーマで "false"
として定義されている場合でも、enabled
属性を省略する <indexing>
要素が存在すると、便宜上、インデックスが自動的に有効になります。プログラムによる設定では、enabled()
を使用する必要があります。
宣言的に
<infinispan> <cache-container default-cache="default"> <replicated-cache name="default"> <indexing> <indexed-entities> <indexed-entity>com.acme.Book</indexed-entity> </indexed-entities> <property name="property.name">some value</property> </indexing> </replicated-cache> </cache-container> </infinispan>
プログラムで
import org.infinispan.configuration.cache.*; ConfigurationBuilder cacheCfg = ... cacheCfg.indexing().enable() .addIndexedEntity(Book.class) .addProperty("property name", "propery value")
11.2.2. インデックス化されたエンティティーの指定
インデックス化タイプを宣言することが推奨されます。これは、次の Data Grid バージョンで必須であるためです。
宣言的に
<infinispan> <cache-container default-cache="default"> <replicated-cache name="default"> <indexing> <indexed-entities> <indexed-entity>com.acme.query.test.Car</indexed-entity> <indexed-entity>com.acme.query.test.Truck</indexed-entity> </indexed-entities> </indexing> </replicated-cache> </cache-container> </infinispan>
プログラムで
cacheCfg.indexing() .addIndexedEntity(Car.class) .addIndexedEntity(Truck.class)
キャッシュが protobuf を保存する場合は、インデックス化されたタイプは protobuf スキーマで宣言された Message
である必要があります。たとえば、以下のスキーマの場合は以下のようになります。
package book_sample; message Book { optional string title = 1; optional string description = 2; optional int32 publicationYear = 3; // no native Date type available in Protobuf repeated Author authors = 4; } message Author { optional string name = 1; optional string surname = 2; }
設定は以下になるはずです。
<infinispan> <cache-container default-cache="default"> <replicated-cache name="books"> <indexing> <indexed-entities> <indexed-entity>book_sample.Book</indexed-entity> </indexed-entities> </indexing> </replicated-cache> </cache-container> </infinispan>
11.2.3. インデックスストレージ
Data Grid は、インデックスをファイルシステムまたはメモリー (local-heap
) に保存できます。ファイルシステムが推奨され、デフォルト設定であり、メモリーインデックスは、再起動後も保持する必要のない中小規模のインデックスにのみ使用する必要があります。
ファイルシステムインデックスの設定:
<replicated-cache name="myCache"> <indexing> <indexed-entities> <indexed-entity>com.acme.Book</indexed-entity> </indexed-entities> <!-- Optional: this is the default setting --> <property name="default.directory_provider">filesystem</property> <!-- Optional: define base folder for indexes --> <property name="default.indexBase">${java.io.tmpdir}/baseDir</property> </indexing> </replicated-cache>
メモリーインデックスの設定:
<replicated-cache name="myCache"> <indexing> <indexed-entities> <indexed-entity>com.acme.Book</indexed-entity> </indexed-entities> <property name="default.directory_provider">local-heap</property> </indexing> </replicated-cache>
11.2.4. インデックスマネージャー
Data Grid は、内部的に Index Manager というコンポーネントを使用して、新規データがインデックスに適用される方法や、データが検索に表示されるタイミングを制御します。
デフォルトの Index Manager directory-based
は、データがキャッシュに書き込まれるとすぐにインデックスに書き込みます。欠点は、インデックスに対してフラッシュと呼ばれる一定のコストのかかる操作を実行する必要があるため、特に大量の書き込みを行うシナリオでキャッシュの書き込みが大幅に遅くなる可能性があることです。
near-real-time
インデックスマネージャーはデフォルトのインデックスマネージャーと似ていますが、Lucene の Near-Real-Time 機能を利用します。基になるストアへのインデックスのフラッシュ頻度が少ないため、書き込みパフォーマンスが向上します。欠点は、シャットダウンが適切に行われない場合に、フラッシュされていないインデックスの変更が失われることです。local-heap
または filesystem
と併用できます。
local-heap
を使用した例:
<replicated-cache name="default"> <indexing> <property name="default.indexmanager">near-real-time</property> <property name="default.directory_provider">local-heap</property> </indexing> </replicated-cache>
filesystem
を使用した例:
<replicated-cache name="default"> <indexing> <property name="default.indexmanager">near-real-time</property> </indexing> </replicated-cache>
11.2.5. インデックスの再構築
インデックスを再構築すると、キャッシュに保存されているデータから再構築されます。インデックス付きタイプやアナライザーの定義などを変更する場合は、インデックスを再構築する必要があります。同様に、何らかの理由でインデックスが削除されている場合は、インデックスを再構築する必要がある場合があります。グリッド内のすべてのデータを再処理する必要があるため、時間がかかる場合があることに注意してください。
Indexer indexer = Search.getIndexer(cache); CompletionStage<Void> future = index.run();