Scalaから簡単に使えるSolr用のクライアントが欲しかったのでSolrJをラップして作ってみました。
基本的には流れるインターフェースかつ、SolrJのクラスを直接使わずにScalaのコレクションを使うようにしています。
ドキュメントの登録はこんな感じ。
import jp.sf.amateras.solr.scala._ val client = new SolrClient("http://localhost:8983/solr") client .add(Map("id"->"1", "manu" -> "Lenovo", "name" -> "ThinkPad X201s")) .add(Map("id"->"2", "manu" -> "Lenovo", "name" -> "ThinkPad X220")) .add(Map("id"->"3", "manu" -> "Lenovo", "name" -> "ThinkPad X121e")) .commit
addは可変長引数になっているので、予め登録するドキュメントがわかっているのであれば以下のように書けます。
client.add( Map("id"->"1", "manu" -> "Lenovo", "name" -> "ThinkPad X201s"), Map("id"->"2", "manu" -> "Lenovo", "name" -> "ThinkPad X220"), Map("id"->"3", "manu" -> "Lenovo", "name" -> "ThinkPad X121e") ).commit
検索はこんな感じ。
// query val result: List[Map[String, Any]] = client.query("name:%name%") .fields("id", "manu", "name") .sortBy("id", Order.asc) .getResult(Map("name" -> "ThinkPad")) result.foreach { doc => println("id: " + doc("id")) println(" manu: " + doc("manu")) println(" name: " + doc("name")) }
検索結果は結果はMapのListで帰ってきます。クエリには「%変数名%」と書いておくとMapで渡したパラメータで置き換えることができます。特殊文字は自動的にエスケープされるのでSQLのプレースホルダのように使えますが、ここはちょっと考え中。
まだファセット検索に対応していないなど、不足している機能もありますが、少しずつ機能を追加していきたいなと思います。あとドキュメントやパラメータにMapだけでなくケースクラスを使えるようにしたいです。