Scala用のSolrクライアントを作ってみた

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だけでなくケースクラスを使えるようにしたいです。