Red Hat Training

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

14.6.4. シャード化インデックス

場合によっては、特定のエンティティーのインデックス付きデータを複数の Lucene インデックスに分割 (シャード) すると役に立つことがあります。
警告
シャード化は、欠点が短所を上回った場合にのみ実装する必要があります。単一の検索用にシャードをすべて開く必要があるため、シャード化されたインデックスの検索は一般的に遅くなります。
シャード化のユースケースを以下に示します。
  • 単一のインデックスが大きいと、インデックスの更新時間は遅くなります。
  • 一般的な検索は、データが顧客、地域、またはアプリケーションによってセグメント化された場合など、インデックスのサブセットのみに一致します。
デフォルトでは、シャードの数が設定されていないとシャード化は有効になりません。これには、hibernate.search.<indexName>.sharding_strategy.nbr_of_shards プロパティーを使用します。

例14.73 インデックスシャーディングの有効化

この例では、5 つのシャードが有効になっています。
hibernate.search.<indexName>.sharding_strategy.nbr_of_shards = 5
データをサブインデックスに分割するには、IndexShardingStrategy を使用します。デフォルトのシャード化ストラテジーは、(FieldBridge によって生成された)ID 文字列表現のハッシュ値に従ってデータを分割します。これにより、シャードが大幅に分散されます。カスタムの IndexShardingStrategy を実装して、デフォルトのストラテジーを置き換えることができます。カスタムストラテジーを使用するには、hibernate.search.<indexName>.sharding_strategy プロパティーを設定する必要があります。

例14.74 カスタムシャーディング戦略の指定

hibernate.search.<indexName>.sharding_strategy = my.shardingstrategy.Implementation
IndexShardingStrategy プロパティーでは、クエリーを実行するシャードを選択して検索を最適化することもできます。フィルターをアクティベートすることで、シャード化ストラテジーはクエリー (IndexShardingStrategy.getIndexManagersForQuery) に回答するために使用されるシャードのサブセットを選択できるため、クエリーの実行が速くなります。
各シャードには独立した IndexManager があるため、異なるディレクトリープロバイダーおよびバックエンド設定を使用するように設定できます。の Animal エンティティーの IndexManager インデックス名例14.75「エンティティーアニマルのシャーディング設定」Animal.0 から Animal.4 です。つまり、各シャードには所有するインデックス名の後に . (ドット) とそのインデックス番号が設定されます。

例14.75 エンティティーアニマルのシャーディング設定

hibernate.search.default.indexBase = /usr/lucene/indexes
hibernate.search.Animal.sharding_strategy.nbr_of_shards = 5
hibernate.search.Animal.directory_provider = filesystem
hibernate.search.Animal.0.indexName = Animal00 
hibernate.search.Animal.3.indexBase = /usr/lucene/sharded
hibernate.search.Animal.3.indexName = Animal03
例14.75「エンティティーアニマルのシャーディング設定」 では、設定はデフォルトの id 文字列ハッシュストラテジーを使用し、シャードは Animal インデックスを 5 つのサブインデックスに使用しています。すべてのサブインデックスはファイルシステムのインスタンスで、各サブインデックスが保存されるディレクトリーは、以下のようになります。
  • sub-index 0: /usr/lucene/indexes/Animal00 (共有 indexBase、indexName を上書き)
  • sub-index 1 の場合: /usr/lucene/indexes/Animal.1 (共有 indexBase、デフォルト indexName)
  • sub-index 2: /usr/lucene/indexes/Animal.2 (共有 indexBase、デフォルト indexName)
  • sub-index 3: /usr/lucene/shared/Animal03 (上書きされた indexBase、上書きされた indexName)
  • sub-index 4: /usr/lucene/indexes/Animal.4 (共有 indexBase、デフォルト indexName)
IndexShardingStrategy を実装する場合は、任意のフィールドを使用してシャード化の選択を判断できます。deletion、purgepurgeAll などの操作を処理するには、すべてのフィールド値またはプライマリー識別子を読み取れずにインデックスを返す必要があることもあります。このような場合、すべてのインデックスが返されるため、削除操作は、削除されるドキュメントが含まれる可能性のあるすべてのインデックスに伝播されます。