solr-scala-client 0.0.2をリリースしました

solr-scala-clientはSolrJをラップしたScala用のシンプルなSolrクライアントです。

今回のバージョンでの修正点は以下の通りです。

  • SolrClientの生成時に初期化を行うための関数を渡せるようになりました。
  • 上記の仕組みを使用してベーシック認証を行う機能を追加しました。
  • ファセット検索をサポートしました。
  • 検索結果やクエリのパラメータにケースクラスを使用できるようになりました。

検索結果はドキュメントとファセット検索の結果を同時に返すようにしたので、直接Listで返すのではなく、MapQueryResultもしくはCaseClassQueryResultというケースクラスで返すようにしました。このケースクラスに検索結果のドキュメントとファセット検索の結果が格納されています。

// ファセット検索
val result = client.query("name:%name%")
      .fields("id", "manu", "name")
      .facetFields("manu")
      .sortBy("id", Order.asc)
      .getResultAsMap(Map("name" -> "ThinkPad X201s"))

// ドキュメントを取得
result.documents.foreach { doc =>
  println("id: " + doc("id"))
  println("  manu: " + doc("manu")
  println("  name: " + doc("name"))
}

// ファセットカウントを取得
result.facetFields.foreach { case (field, counts) =>
  println("field: " + field)
  counts.foreach { case (manu, count) =>
    println("  " + manu + ": " + count)
  }
}

また、検索結果とクエリのパラメータにケースクラスを使用できるようになりました。更新系のメソッドは未対応ですが、次のバージョンで対応します。

// ドキュメントをマッピングするケースクラス
case class Product(id: String, manu: Option[String], name: String)
// クエリのパラメータとして渡すケースクラス
case class Param(name: String)

// 検索結果とパラメータにケースクラスを使用した検索
val result = client.query("name:%name%")
      .fields("id", "manu", "name")
      .facetFields("manu")
      .sortBy("id", Order.asc)
      .getResultAs[Product](Param("ThinkPad"))

result.documents.foreach { product =>
  println(product)
}

あと、SolrClientの生成時に初期化を行うための関数を渡せるようになりました。この関数はSolrJのCommonsHttpSolrServerを受け取って任意の処理を行うことができます。

val client = new SolrClient("http://localhost:8983/solr", {
  server: CommonsHttpSolrServer => // 任意の初期化処理
})

0.0.2ではこの機能を使用してベーシック認証を行う機能を実装しています。こんな感じで使用できます。

val client = new SolrClient("http://localhost:8983/solr", 
  Auth.basic("username", "password"))

あとは検索に関する詳細な設定をどこまでできるようにするかですかね。Solrにはいろんなパラメータがありますし、自分もそんなに使い込んでいるわけではないのでどこまでやればいいのかがイマイチよくわかっていません。実際に自分で使いながら必要な機能を実装していく感じになりそうです。