---
title: "複数インデックス(シャーディング)"
slug: "multiple-indexes--sharding-"
abstract: "シャーディングを使ってデータを別々の検索インデックスに保存する方法。"
---
# 複数インデックス(シャーディング)

インデックスシャーディングは、インデックス内の文書をより小さなパーティションに分割するプロセスです。これらの小さなパーティションはシャードと呼ばれます。その結果、すべてのドキュメントが1つの大きなインデックスにまとめられるのではなく、ドキュメントがシャード間で分散されます。シャーディングプロセスには、ドキュメントのシャード割り当て方法を決定するロジック(「シャーディング戦略」)があります。

1つのインデックスでほとんどのSitecoreソリューションのニーズを満たしますが、必要に応じて複数のインデックスでより良いスケーリングが可能です。

## シャーディングとソル

Solrを使うと、Sitecoreはシャーディングを処理しません。代わりに、SolrアプリケーションのSolrCloud機能がシャーディングを処理します。

Solrは文書をシャードに自動割り当てでき、レプリケートシャードなどの追加機能も備えています。レプリケートシャードは故障やフェイルオーバーのシナリオを処理するのに役立ちます。

SitecoreのSolr実装は、シャード化されたエンドポイントを非シャードのエンドポイントと同じ方法で扱います。Solrのシャードインデックスを扱うために追加の設定は必要ありません。

> !注Sitecoreはフェイルオーバーを完全にはサポートしていません。具体的には、Sitecore(Solrクライアントとして)は、現在のサーバー(リーダー)がダウンした場合、Solrサーバー間(Solrレプリカ)間を切り替えることができません。

[SolrCloudの設定についての詳細はhttps://cwiki.apache.org/confluence/display/solr/SolrCloudをご覧ください。](https://cwiki.apache.org/confluence/display/solr/SolrCloud)

## シャーディングとルセネ

Luceneを使うと、3つのSitecoreデータベース(マスター、ウェブ、コア)のデータはデフォルトで単一の検索インデックスに保存されます。検索インデックスが増えるにつれて、各データベースのデータをそれぞれ独立した検索インデックスに格納するシャーディング戦略を実装できます。

他の方法でシャードすることもできます。例えば、メディアライブラリ用の別のインデックスを作ることができます。

バケットを使っていて何千、何百万ものアイテムがあるなら、Luceneを使い続けたいならシャーディングが有効な方法です。検索インデックスが増え続けてこの戦略には大きすぎるなら、Solrに切り替えるべきです。

> !注シャーディングを使う場合は、他のLucene設定ファイルをオフにする必要があります。これらのファイルを有効にしておくと冗長なインデックスが発生します。

### 複数の検索インデックスを設定する

Sitecoreは、各データベースのインデックス作成に役立つ以下の例設定ファイルを提供しています:

Sitecore.ContentSearch.Lucene.Indexes.Sharded.Core.config.example

Sitecore.ContentSearch.Lucene.Indexes.Sharded.Master.config.example

Sitecore.ContentSearch.Lucene.Indexes.Sharded.Web.config.example

これらのファイルはwwwroot\\<site name>\\App\_Config\\Include\\Examplesフォルダに保存されています。

これらの設定ファイルが十分にシャード化されていなければ、必要に応じて設定を変更することができます。

以下のコードサンプルと表を使って、追加すべき内容を確認してください:

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
 <sitecore>
 <contentSearch>
 <configuration type="Sitecore.ContentSearch.LuceneProvider.LuceneSearchConfiguration,
 Sitecore.ContentSearch.LuceneProvider">
 <indexes hint="list:AddIndex">
 <index id="sitecore\_core\_index"
 type="Sitecore.ContentSearch.LuceneProvider.LuceneIndex,
 Sitecore.ContentSearch.LuceneProvider">
 <param desc="name">$(id)</param>
 <param desc="folder">$(id)</param>
 <!-- This initializes index property store. Id has to be set to the index id -->
 <param desc="propertyStore" ref="contentSearch/databasePropertyStore"
 param1="$(id)" />
 <strategies hint="list:AddStrategy">
 <!-- NOTE: order of these is controls the execution order -->
 <strategy ref="contentSearch/indexUpdateStrategies/intervalAsyncCore" />
 </strategies>
 <commitPolicy hint="raw:SetCommitPolicy">
 <policy type="Sitecore.ContentSearch.TimeIntervalCommitPolicy,
 Sitecore.ContentSearch" />
 </commitPolicy>
 <commitPolicyExecutor hint="raw:SetCommitPolicyExecutor">
 <policyExecutor type="Sitecore.ContentSearch.CommitPolicyExecutor,
 Sitecore.ContentSearch" />
 </commitPolicyExecutor>
 <locations hint="list:AddCrawler">
 <crawler type="Sitecore.ContentSearch.LuceneProvider.Crawlers.DefaultCrawler,
 Sitecore.ContentSearch.LuceneProvider">
 <Database>core</Database>
 <Root>/sitecore</Root>
 </crawler>
 </locations>
 </index>
 </indexes>
 </configuration>
 </contentSearch>
 </sitecore>
</configuration>

名称

概要

例

<Root>

インデックスに含まれるコンテンツツリーのルートノードを指定します。

<Root>/sitecore/media library</Root>

<name>

検索インデックスの名前。

<param desc="name">$(id)</param>

<Database>

データベース名。

<Database>core</Database>

<strategies>

運用すべきインデックス戦略の一覧。

<strategies hint="list:AddStrategy">  
  
<strategy  
  
ref="contentSearch/indexUpdateStrategies/intervalAsyncCore" />  
  
</strategies>

<CommitPolicy>

インデックスがメモリや一時ファイルに含まれているデータをディスクにコミットするタイミングを制御します。これは時間ベースでもドキュメントカウントベースでも構いません。

<commitPolicy  
  
hint="raw:SetCommitPolicy">  
  
<policy  
  
type="Sitecore.ContentSearch.TimeIntervalCommitPolicy,Sitecore.ContentSearch"/>  
  
</commitPolicy>

<commitPolicyExecutor>

コミットを実行するクラスです。

<commitPolicyExecutor hint="raw:SetCommitPolicyExecutor">  
  
<policyExecutor type="Sitecore.ContentSearch.CommitPolicyExecutor, Sitecore.ContentSearch" />  
  
</commitPolicyExecutor>

### インデックスコンテキストスイッチャー

シャーディングを使う場合、SitecoreContext.Itemに対する <Root> 要素を使ってどのインデックスを使うかを決定します。このインデックス切り替えは自動的に行われます。

> !注 <Root> がより具体的であればあるほど、設定ファイル上で上位に記載する必要があります。インデックスコンテキストスイッチャーは、インデックスをリストの順番で使います。

例えば、/sitecore/content/Homeの要素<Root>インデックスがある場合、/sitecore/content/Home/Flightsの<Root>要素のインデックスの下に配置されるべきです:

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
 <sitecore>
 <contentSearch>
 <configuration type="Sitecore.ContentSearch.LuceneProvider.LuceneSearchConfiguration,
 Sitecore.ContentSearch.LuceneProvider">
 <indexes hint="list:AddIndex">
 <index id="sitecore\_core\_index"
 type="Sitecore.ContentSearch.LuceneProvider.LuceneIndex,
 Sitecore.ContentSearch.LuceneProvider">
 <param desc="name">$(id)</param>
 <param desc="folder">$(id)</param>
 <!-- This initializes index property store. Id has to be set to the index id -->
 <param desc="propertyStore" ref="contentSearch/databasePropertyStore"
 param1="$(id)" />
 <strategies hint="list:AddStrategy">
 <!-- NOTE: order of these is controls the execution order -->
 <strategy ref="contentSearch/indexUpdateStrategies/intervalAsyncCore" />
 </strategies>
 <commitPolicy hint="raw:SetCommitPolicy">
 <policy type="Sitecore.ContentSearch.TimeIntervalCommitPolicy,
 Sitecore.ContentSearch" />
 </commitPolicy>
 <commitPolicyExecutor hint="raw:SetCommitPolicyExecutor">
 <policyExecutor type="Sitecore.ContentSearch.CommitPolicyExecutor,
 Sitecore.ContentSearch" />
 </commitPolicyExecutor>
 <locations hint="list:AddCrawler">
 <crawler type="Sitecore.ContentSearch.LuceneProvider.Crawlers.DefaultCrawler,
 Sitecore.ContentSearch.LuceneProvider">
 <Database>core</Database>
 <Root>/sitecore</Root>
 </crawler>
 </locations>
 </index>
 </indexes>
 </configuration>
 </contentSearch>
 </sitecore>
</configuration>

### デフォルトのシャーディング戦略

Sitecoreはデフォルトのシャーディング戦略であるLucenePartitionShardingStrategyを提供します。この戦略は文書を取り、IDのハッシュを計算してどのシャードに入れるかを決定します。このハッシュは非常に高速で、共有状態やID生成に依存しません。この方法は完全に均等な分布を得られるわけではありません(例えば、100件のドキュメントが50/50に分割されることはありません)が、パフォーマンスを大幅に向上させます。

この戦略には1つのオプションしかありません: shardDistributionパラメータです。このパラメータを2の倍数(2、4、8、16など)に設定し、インデックスを分割するシャードの数を指定します。

### 新しいシャーディング戦略を作成

デフォルトの戦略が必要でない場合は、自分で実装できます。これはSitecore.ContentSearch.Sharding.IShardingStrategyインターフェースを使い、実装をインデックスに渡すことで行います。

戦略を適用した後にインデックスを再構築すべきです。必須ではありませんが、インデックスにより均等なドキュメント分布をもたらします。