23.2.4. シャード化インデックス
場合によっては、特定のエンティティーのインデックス付きデータを複数の Lucene インデックスに分割 (シャード) すると役に立つことがあります。
警告
シャード化は、欠点が短所を上回った場合にのみ実装する必要があります。単一の検索用にシャードをすべて開く必要があるため、シャード化されたインデックスの検索は一般的に遅くなります。
シャード化のユースケースを以下に示します。
- 単一のインデックスが大きいと、インデックスの更新時間は遅くなります。
- 一般的な検索は、データが顧客、地域、またはアプリケーションによってセグメント化された場合など、インデックスのサブセットのみに一致します。
デフォルトでは、シャードの数が設定されていないとシャード化は有効になりません。これには、
hibernate.search.<indexName>.sharding_strategy.nbr_of_shards
プロパティーを使用します。
例23.3 インデックスシャード化の有効化
この例では、シャードが 5 個有効になります。
hibernate.search.<indexName>.sharding_strategy.nbr_of_shards = 5
データをサブインデックスに分割することが、
IndexShardingStrategy
です。デフォルトのシャーディングストラテジーは、ID 文字列表現のハッシュ値( FieldBridge
によって生成される)に従ってデータを分割します。これにより、シャードが大幅に分散されます。カスタム IndexShardingStrategy
を実装して、デフォルトのストラテジーを置き換えることができます。カスタムストラテジーを使用するには、hibernate.search.<indexName>.sharding_strategy
プロパティーを設定する必要があります。
例23.4 カスタムシャード化ストラテジーの指定
hibernate.search.<indexName>.sharding_strategy = my.shardingstrategy.Implementation
IndexShardingStrategy
プロパティーでは、クエリーを実行するシャードを選択して検索を最適化することもできます。フィルターシャードストラテジーをアクティベートすることで、クエリーに応答するために使用されるシャードのサブセット(IndexShardingStrategy.getIndexManagersForQuery
)を選択し、クエリーの実行時間を短縮できます。
各シャードには独立した
IndexManager
があるため、異なるディレクトリープロバイダーおよびバックエンド設定を使用するように設定できます。例23.5「エンティティーアニメーション設定のシャーディング」 の Animal エンティティーの IndexManager
インデックス名は Animal.0
から Animal.4
までです。つまり、各シャードには独自のインデックスの名前の後に .
(ドット)およびそのインデックス番号が続きます。
例23.5 エンティティーアニメーション設定のシャーディング
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
例23.5「エンティティーアニメーション設定のシャーディング」 では、設定では、デフォルトの id 文字列ハッシュストラテジーを使用し、Anonim
al インデックスを
5 つのサブインデックスにシャード化します。すべてのサブインデックスはファイルシステムのインスタンスで、各サブインデックスが保存されるディレクトリーは、以下のようになります。
- サブインデックス 0 の場合:
/usr/lucene/indexes/Animal00
(共有 indexBase が上書きされた indexName)の場合 - for sub-index 1:
/usr/lucene/indexes/Animal.1
(shared indexBase, default indexName) - for sub-index 2:
/usr/lucene/indexes/Animal.2
(shared indexBase, default indexName) - サブインデックス 3 の場合:
/usr/lucene/shared/Animal03
(overridden indexBase, overridden indexName) - サブインデックス 4 の場合:
/usr/lucene/indexes/Animal.4
(共有 indexBase、デフォルトの indexName)
IndexShardingStrategy
を実装する場合、このフィールドを使用してシャーディングの選択を判別できます。deletion、purge
、purgeAll
などの操作を処理するには、すべてのフィールド値またはプライマリー識別子を読み取れずにインデックスを返す必要があることもあります。このような場合、すべてのインデックスが返されるため、削除操作は、削除されるドキュメントが含まれる可能性のあるすべてのインデックスに伝播されます。