最近この必要性に出くわしましたが、グーグルで役立つものは何も見つかりませんでした。以下はクエリ専用ですが、展開できます。SolrJ クラスにとどまりたいと思っていると思います。SolrQuery と QueryResponse の操作は非常に簡単です。
だからクエリする。通常どおり SolrQuery を構築する必要があります。「wt」には「javabin」を指定します。これにより、SolrJ が内部で使用する圧縮バイナリ形式で応答が得られます。
val sq = new SolrQuery()
sq.set("wt", "javabin")
...
SolrQuery を WS が理解できるものに変える必要があります。(すべてのインポートを追加したわけではありません。ほとんどのインポートは [たとえば、IDE によって] 簡単に理解できるからです。私が含めたものはそれほど明白ではないかもしれません。)
import scala.collection.JavaConverters._
def solrQueryToForm(sq: SolrQuery): Map[String, Seq[String]] = {
sq.getParameterNames.asScala.foldLeft(Map.empty[String, Seq[String]]) {
case (m, n) =>
m + (n -> sq.getParams(n))
}
}
私のショップでは、デフォルトのコレクションとハンドラー (つまり、「/select」) を使用していますが、これらを SolrQuery でオーバーライドする必要があります。
def solrEndpoint(sq: SolrQuery): String = {
val coll = sq.get("collection", defaultCollection)
val hand = Option(sq.getRequestHandler).getOrElse(defaultHandler)
formSolrEndpoint(solrUrl, coll, hand)
}
def formSolrEndpoint(base: String, collection: String, handler: String): String = {
val sb = new StringBuilder(base)
if (sb.last != '/') sb.append('/')
sb.append(collection)
if (!handler.startsWith("/")) sb.append('/')
sb.append(handler)
sb.result()
}
WSResponse を QueryResponse にマップするには、いくつかのコードが必要です。
import com.ning.http.client.{Response => ACHResponse}
def wsResponseToQueryResponse(wsResponse: WSResponse)(implicit ctx: ExecutionContext): QueryResponse = {
val jbcUnmarshal = {
val rbis = wsResponse.underlying[ACHResponse].getResponseBodyAsStream
try {
new JavaBinCodec().unmarshal(rbis)
}
finally {
if (rbis != null)
rbis.close()
}
}
// p1: SolrJ pulls the same cast
// p2: We didn't use a SolrServer to chat with Solr so cannot provide it to QueryResponse
new QueryResponse(jbcUnmarshal.asInstanceOf[NamedList[Object]], null)
}
これで、Play の非同期 WS サービスを使用して Solr を呼び出すためのすべての要素が得られます。
def query(sq: SolrQuery)(implicit ctx: ExecutionContext): Future[QueryResponse] = {
val sqstar = sq.getCopy
sqstar.set("wt", "javabin")
WS.url(solrEndpoint(sqstar))
.post(solrQueryToForm(sqstar))
.map(wsResponseToQueryResponse)
}
Play は Web サービス コードをスタンドアロンの jar として公開するようになったので、これはほとんどすべてのプロジェクトが Solr を非同期的にクエリできることを意味します。それが役に立つことを願っています。