みんな大好き、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);