Distributed Search in Solr 1.3
分散は結構簡単そう。shards=localhost:8080/solr,localhost:8081/solr
とかすればすぐできる見たいで素敵

一応、shards数は、GETメソッドの長さの制限(webサーバ)がそのまま適用されるかんじ。
大体4000文字までいけるそうですが、shardが多くなってくるときはここを注意する。
※dnsやhostsとかで短い名前をつけてしまえば、いいかも


Solr1.3より実装されています。

■Distributed Searchとは?
インデックスがひとつのシステムの中で非常に大きくなってしまった場合やひとつのクエリーの検索結果が非常に大きくなってしまった場合、インデックスを複数のShardに分割することができます。
そして、Solrは複数のShardにクエリを投げ、マージして結果を取得できます。
※shardとは・・・Solrのひとまとまりみたいなもの。インデックスとかもっていて、単体でも検索機能を提供できる

■分散検索を行う
複数のshardに対して検索を行うには、
パラメータのshardsに、対象となるshardのリストを列挙します。
【例】
http://localhost:8983/solr/select?shards=localhost:8983/solr,localhost:7574/solr&indent=true&q=ipod+solr

現在は、クエリ要求のみ対応しています。
対応しているコンポーネントは、
・クエリーコンポーネント
・ファセットコンポーネント(1.3までは、countによるが、1.4からはnameでのソートに対応)
・ハイライトコンポーネント
・スタットコンポーネント
・デバッグコンポーネント

See also WritingDistributedSearchComponents
書き込みに関しては、別ドキュメントで

■分散検索の制限
・ドキュメントは、ユニークキーを持っていなければならない
・同じドキュメントIDの結果を取得した場合は、最初に取得したドキュメントのみを返します。
・分散されたidfはない
・QueryElevationComponentをサポートしません。
・インデックスがステージの間で変化できて、例えば、質問に合って、次に変えられたドキュメントは、もう合わないかもしれませんが、それでも、検索されるでしょう。
・日付のファセット検索は対応していない
・shardの数は、GETメソッドのURIの文字数の制限があります。ほとんどのウェブサーバは4000字までです。

■デッドロック(Excite翻訳そのまま)
各破片は、また、トップレベル問い合わせ要求に役立って、次にサブ要求を他の破片のすべてにするかもしれません。
この構成では、サーブレットコンテナでHTTP要求に役立つスレッドの最大数が確実にトップレベルクライアントと他の破片の両方からの要求の可能な数より大きくなるようにするために、注意するべきです。

これがそうでなければ、分散デッドロックは可能です。
まさしくそれぞれシングルスレッドがある2つの破片の最も簡単なケースがHTTP要求を修理すると考えてください。
両方のスレッドは、同時にトップレベル要求を受け取って、サブ要求をお互いに出すかもしれません。
サービスのリクエストへのそれ以上の残っているスレッドが全くないので、他の未定の要求が終わるまで(終わって、サブ要求を待つことがないでしょう)、サーブレットコンテナは入って来る要求を妨げるでしょう。

■分散インデクシング
ユーザが自分で行う必要があります。
どのように分散させてインデクシングを行うかは、


uniqueId.hashCode() % numServers.
(ユニークキーのIDのハッシュをサーバ台数で割り、あまりの値でどのサーバに分散するかをきめます)

といったアルゴリズムを使って、分散させる手法が簡単です。


■導入例
こちらでは、port: 8983と7574の二つにSolrを起動し、それぞれにインデクシングを行って、検索します。
マージされるはず。
#make a copy
cd solr
cp -r example example7574

#change the port number(ポート:7575で動かしたり、POSTするために書き換え)
perl -pi -e s/8983/7574/g example7574/etc/jetty.xml example7574/exampledocs/post.sh

#in window 1, start up the server on port 8983 (ポート:8983で起動)
cd example
java -server -jar start.jar

#in window 2, start up the server on port 7574(ポート:7574で起動)
cd example7574
java -server -jar start.jar

#in window 3, index some example documents to each server(それぞれのポートのSolrに登録)
cd example/exampledocs
./post.sh [a-m]*.xml
cd ../../example7574/exampledocs
./post.sh [n-z]*.xml

#now do a distributed search across both servers with your browser or curlcurl 'http://localhost:8983/solr/select?shards=localhost:8983/solr,localhost:7574/solr&indent=true&q=ipod+solr'