【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ページ) これだけでイケるのでシンプルで良いですね。 次はロギングの話でも。。 ってか↓この本メチャメチャいいです!お世話になっています。
Solrをイジった備忘録その1(データ投入編)
Apache Solr入門 ―オープンソース全文検索エンジン
posted with amazlet at 10.04.16