2013年11月10日

SolrJでSoftCommitしようとした

みんな大好き、SolrJでSoftCommitしようと思ったけど、どうやれば良いのかわからなかったので調べた。


まず、SolrServerのcommitメソッドの3つ目の引数に boolean softCommit というのが追加されていたのを見かけた。

http://lucene.apache.org/solr/4_5_1/solr-solrj/org/apache/solr/client/solrj/SolrServer.html

commit(boolean waitFlush, boolean waitSearcher, boolean softCommit)

waitFlushは、コミットが完了するまで待機するか。watiSearcherは、コミット後に新しいSearcherが割り振られるまで待機するか。そして最後がsoftCommit。つまり commit(true, true, true) とすればうまくいくのかと思ったけど、やってみたらハードコミットされていたようで、ストレージに書きこまれていた。

原因は conf/solrconfig.xml にauto commitが設定されているからではないかと思われる。ということで、下記の行をコメントアウトしてSolrを再起動。あと、投入するサイズが大きいと、ログの容量から溢れてcommitが勝手に実行されるようだ。

     <autoCommit> 
       <maxTime>${solr.autoCommit.maxTime:15000}</maxTime> 
       <openSearcher>false</openSearcher> 
     </autoCommit>

これで100件くらいドキュメントを放り込んで commit(true, true, true) したところ、ディスクに吐き出されなかった。また、commit(true, true, false) にしたら、ちゃんとハードコミットされた。


余談。Soft Commitの詳しい挙動については下記のページはわかりやすかった。

Understanding Solr Soft Commits and Data Durability
http://www.opensourceconnections.com/2013/04/25/understanding-solr-soft-commits-and-data-durability/

上記のサイトに書かれている内容を要約すると、まず、SolrにSoftCommitして速攻でCtrl+CでSolrを落とし、再起動したけど、コミットしたデータが消えていなかった。これはログファイルから復旧したり、Ctrl+Cした時に情報を残してくれたりするお陰らしい。

で、最終的にCtrl+Cでは生易しいという事で、kill -9 した後にログファイルを削除してSolrを立ち上げたら、ちゃんとデータが残ってませんでした、という結果になった。

もう少しあっさり消滅してしまうものかと思ったけど、意外と頑張って残そうとしてくれるようだ。


今回使ったソースコードはこんな感じ。

        SolrServer server = new HttpSolrServer("http://localhost:8983/solr/collection1");

        // 100個くらいドキュメントを入れてみる
        for (int i = 0; i < 100; i++) {
            SolrInputDocument doc = new SolrInputDocument();
            doc.addField("id", String.valueOf(i + 1));
            doc.addField("text", "コンテンツ");
            server.add(doc);
        }

        server.commit(true, true, true);