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、purge
、purgeAll
などの操作を処理するには、すべてのフィールド値またはプライマリー識別子を読み取れずにインデックスを返す必要があることもあります。このような場合、すべてのインデックスが返されるため、削除操作は、削除されるドキュメントが含まれる可能性のあるすべてのインデックスに伝播されます。