【Solrへのデータ投入】
Solrへのデータの投入の流れは以下のようになります。
======
ドキュメントを作って⇒SolrServerにaddして⇒コミットして⇒最適化して
======
Javaを使って、Solrへデータを投入する場合、SolrJというライブラリがあります。
SolrJではSolrServerというクラスを使ってSolrと会話をします。
SolrServerは抽象的なオブジェクトになっていて、実装は以下の3つです。
1. CommonsHttpSolrServer
HTTP通信でデータを入れ込みます。
SolrはJettyやTomcatといったServletコンテナ上で動作するアプリケーションなので、
なんといいますか、普通にWebアプリみたいな感じです。
Restfulとかそういうわけでもなく、その辺も普通のWebアプリ的です。
2. EmbeddedSolrserver
中身の実装は良くわかりませんが、直接Solrにデータを入れ込みます。
HTTP的な処理をしなくて良いので速度は早くなります。
イメージ的には、Solrからデータベースやファイルシステムなどに
データを取りにいって反映する感じです。
自分のサービスではEmbeddedSolrServerを使用しています。
3. LBHttpSolrServer
LBはロードバランスの略で、ラウンドロビンによる負荷分散ができるそうです。
使ったことありません。
今回は負荷テスト用に1.のCommonsHttpSolrServerを使ってみました。
テスト環境なのでプロキシサーバを介して行うのですが、なぜかちとハマりました。
プロキシサーバを設定するのに、
– シェルの中でexportで環境変数にセットしたり
– JavaVMの起動オプションで-Dでセットしたり
– Javaの中でSystem.getProperties().put~とかやったり
が、うまいこと効かなくて。。
最終的には以下のようなやり方で対応しました。
======
// commonsのHTTPクライアントのインスタンスを作って
HttpClient client = new HttpClient();
// 作ったHTTPクライアントにプロキシの設定をしてあげて
client.getHostConfiguration().setProxy(“プロキシサーバ”, ポート);
// SolrServerをnewする時に作ったHTTPクライアントを渡してあげます
SolrServer server = new CommonsHttpSolrServer(“http://サーバ/solr”, client);
// ちなみに疎通確認ように、SolrServerにはpingなんていうメソッドがあったりします。
server.ping();
======
で、次にドキュメントの作成と、Solrへドキュメントを突っ込むところですが、
非常に簡単です。
======
// ドキュメントのオブジェクトを生成して
SolrInputDocument document = new SolrInputDocument();
// フィールド名に値をaddします
document.addField(“フィールド名”, “値”);
・・ 何個かフィールドがある ・・
// SolrServerにadd
server.add(document);
======
addしただけでは、インデックスに反映されません。
Solrの管理画面上で参照すると docsPending というところに
数値が乗っかってくるのが分かります。(http://サーバ/solr/admin/stats.jsp)
インデックスに反映させるには、RDBMSと同じようにcommitしてあげます。
======
server.commit();
======
コミットすると、Solrは内部的に11個のインデックスファイルを生成します。
これが積もり積もっていくと、ファイルが増えすぎて、、な状態になります。
ということで、commitしたら何回かに1回は最適化(optimize)してあげます。
======
server.optimize();
======
Apache Solr入門には5回に1回は~と記述されていました。(267ページ)
これだけでイケるのでシンプルで良いですね。
次はロギングの話でも。。
ってか↓この本メチャメチャいいです!お世話になっています。
技術評論社
売り上げランキング: 4461
検索エンジンに興味のある全ての知識レベルの方にお勧め
コメント
[…] 以前Solrをイジった備忘録その1(データ投入編)でEmbeddedSolrServerなんちゅうのを使ってますよ なんてエントリを書きましたが、その時もRequestHandlerを追加したわけなんですが、 ローカルのUb […]