Solr Client for Scala
The simple Apache Solr client for Scala.
This is based on the SolrJ and provides optimal interface for Scala.
Add the following dependency into your build.sbt
to use solr-scala-client.
libraryDependencies += "com.github.takezoe" %% "solr-scala-client" % "0.0.27"
If you want to test SNAPSHOT version, add the following dependency instead of above:
resolvers += "sonatype-oss-snapshot" at "https://oss.sonatype.org/content/repositories/snapshots"
libraryDependencies += "com.github.takezoe" %% "solr-scala-client" % "x.x.x-SNAPSHOT"
This is a simplest example to show usage of solr-scala-client.
import com.github.takezoe.solr.scala._
val client = new SolrClient("http://localhost:8983/solr")
// register
client
.add(Map("id"->"001", "manu" -> "Lenovo", "name" -> "ThinkPad X201s"))
.add(Map("id"->"002", "manu" -> "Lenovo", "name" -> "ThinkPad X220"))
.add(Map("id"->"003", "manu" -> "Lenovo", "name" -> "ThinkPad X121e"))
.commit
// query
val result = client.query("name: %name%")
.fields("id", "manu", "name")
.sortBy("id", Order.asc)
.getResultAsMap(Map("name" -> "ThinkPad"))
result.documents.foreach { doc: Map[String, Any] =>
println("id: " + doc("id"))
println(" manu: " + doc("manu"))
println(" name: " + doc("name"))
}
It’s also possible to use the case class as the search result and parameters instead of Map.
// query
val result = client.query("name: %name%")
.fields("id", "manu", "name")
.sortBy("id", Order.asc)
.getResultAs[Product](Param(name = "ThinkPad"))
result.documents.foreach { product: Product =>
println("id: " + product.id)
println(" manu: " + product.manu)
println(" name: " + product.name)
}
Following notations are available to embed variables to the query:
See examples of parameterized queries and assembled Solr queries.
// %VAR_NAME% (Single keyword)
client.query("name: %name%").getResultAsMap(Map("name" -> "ThinkPad X201s"))
// => name:"ThinkPad X201s"
// $VAR_NAME$ (String replacement)
client.query("name: $name$").getResultAsMap(Map("name" -> "ThinkPad AND X201s"))
// => name:ThinkPad AND X201s
// ?VAR_NAME? (Expression)
client.query("name: ?name?").getResultAsMap(Map("name" -> "ThinkPad & X201s"))
// => name:("ThinkPad" AND "X201s")
Configure the query to return the highlighted content by QueryBuilder#highlight()
.
The highlighted content is set as the “highlight” property to the Map or the case class.
val result = client.query("content: Scala")
// NOTE: unique key field is required.
.fields("id")
// Specify the highlighted field, prefix and postfix (prefix and postfix are optional).
.highlight("content", "<strong>", "</strong>")
.getResultAsMap()
result.documents.foreach { doc: Map[String, Any] =>
println("id: " + doc("id"))
println(doc("highlight")) // highlighted content is set as the "highlight" property
}
solr-scala-client expects that the unique key is “id”.
If your schema has the different field as the unique key, you can specify the unique key name as following:
val result = client.query("content: Scala")
.id("documentId") // Specify the unique key name
.fields("documentId")
.highlight("content", "<strong>", "</strong>")
.getResultAsMap()
solr-scala-client has also asynchronous API based on AsyncHttpCleint.
val client = new AsyncSolrClient("http://localhost:8983/solr")
// Register
client
.register(Map("id" -> "005", "name" -> "ThinkPad X1 Carbon", "manu" -> "Lenovo"))
.onComplete{
case Success(x) => println("registered!")
case Failure(t) => t.printStackTrace()
}
// Query
client.query("name:%name%")
.fields("id", "manu", "name")
.facetFields("manu")
.sortBy("id", Order.asc)
.getResultAsMap(Map("name" -> "ThinkPad X201s"))
.onComplete {
case Success(x) => println(x)
case Failure(t) => t.printStackTrace()
}
See more example at AsyncSolrClientSample.scala.
com.github.takezoe
QueryBuilderBase#fq()
QueryBuilderBase#setRequestHandler()
SolrClient#shutdown()
QueryBuilder
became immutablerollback
and withTransaction
to SolrScalaClient
.ExpressionParser
bugs.ExpressionParser
became pluggable and added GoogleExpressionParser
as an optional implementation of ExpressionParser
.Auth.basic
moved to SolrServerFactory.basicAuth
and SolrServerFactory.dummy
for unit testing.?VAR_NAME?
in SolrClient#query()
.commit()
method to SolrClient
.SolrClient
.