3.2. インデックスの分割

巨大なインデックス (サイズ) が関係する一部の極端な状況では、特定のエンティティタイプのインデックスデータを複数の Lucene インデックスに分割することが必要になります。このソリューションの使用は、インデックスのサイズが巨大になり、インデックスの更新によりアプリケーションの稼働に影響がでるまで推奨されません。インデックス分割の主な欠点は 1 つの検索でより多くのファイルを開く必要があるため、検索が低速になることです。つまり、この作業は問題が発生するまで行わないでください。
この強い警告にも関わらず、Hibernate Search では特定のエンティティタイプを複数のサブインデックスにインデックス化できます。IndexShardingStrategy により、データは異なるサブインデックスに分割されます。デフォルトでは、分割の数が設定されない限り、分割方針は有効になりません。分割の数を設定するには、次のプロパティを使用します。

例3.3 特定のインデックスに対して nbr_of_shards を指定することによりインデックスの分割を有効化

hibernate.search.<indexName>.sharding_strategy.nbr_of_shards 5
この場合は 5 つの異なる分割を使用します。
デフォルトの分割方針 (分割が設定された場合) では、id 文字列表記のハッシュ値 (Field Bridge により生成される) に従ってデータが分割されます。これにより非常にバランスの取れた分割が保証されます。方針は、IndexShardingStrategy を実装し、以下のプロパティを設定することにより変えることができます。

例3.4 カスタム分割方針の指定

hibernate.search.<indexName>.sharding_strategy my.shardingstrategy.Implementation
「Directory 構成」 で示されたように、各分割は独立したディレクトリプロバイダ設定を持ちます。以前の例の DirectoryProvider デフォルト名は <indexName>.0<indexName>.4 です。つまり、各分割は独自のインデックスの名前の後に . (ドット) とインデックス番号が付いた名前を持ちます。

例3.5 サンプルのエンティティAnimal に対する分割設定の構成

hibernate.search.default.indexBase /usr/lucene/indexes

hibernate.search.Animal.sharding_strategy.nbr_of_shards 5
hibernate.search.Animal.directory_provider org.hibernate.search.store.FSDirectoryProvider
hibernate.search.Animal.0.indexName Animal00
hibernate.search.Animal.3.indexBase /usr/lucene/sharded
hibernate.search.Animal.3.indexName Animal03
この設定はデフォルトの id 文字列ハッシュ方針を使用し、Animal インデックスを 5 つのサブインデックスに分割します。すべてのサブインデックスは FSDirectoryProvider インスタンスであり、各サブインデックスが格納されるディレクトリは以下のとおりです。
  • サブインデックス 0 用: /usr/lucene/indexes/Animal00 (共有された indexBase、上書きされた indexName)
  • サブインデックス 1 用: /usr/lucene/indexes/Animal.1 (共有された indexBase、デフォルトの indexName)
  • サブインデックス 2 用: /usr/lucene/indexes/Animal.2 (共有された indexBase、デフォルトの indexName)
  • サブインデックス 3 用: /usr/lucene/shared/Animal03 (上書きされた indexBase、上書きされた indexName)
  • サブインデックス 4 用: /usr/lucene/indexes/Animal.4 (共有された indexBase、デフォルトの indexName)