日曜日, 3月 22, 2009

[Life] ScalaでSolrj!

下のソースで、以下条件下にて、
 ・Solr(v1.4-dev/今のtrunk)のサーバ相手に
 ・Solr(v1.3)のsolrjライブラリで
実行すれば、ABROADのスポット情報1件をインターネットから取得してうまく日本語も投入してくれることを確認しました。

なぜv1.4のsolrjを組み込むとうまく動かないのか。。(補足:SOLR-973にタイムリーにはまっていたようで、今updateしたらサーバもsolrjもv1.4で正常動作しました!)


// >\scala-2.7.3.fin\bin\scalac -cp c:\apache-solr-1.3.0\dist\solrj-lib\commons-httpclient-3.1.jar;c:\apache-solr-1.3.0\dist\apache-solr-solrj-1.3.0.jar;c:\apache-solr-1.3.0\dist\apache-solr-core-1.3.0.jar;c:\apache-solr-1.3.0\dist\apache-solr-common-1.3.0.jar getAB.scala
// >\scala-2.7.3.fin\bin\scala -cp .;c:\apache-solr-1.3.0\dist\solrj-lib\commons-httpclient-3.1.jar;c:\apache-solr-1.3.0\dist\apache-solr-solrj-1.3.0.jar;c:\apache-solr-1.3.0\dist\apache-solr-core-1.3.0.jar;c:\apache-solr-1.3.0\dist\apache-solr-common-1.3.0.jar;c:\apache-solr-1.3.0\dist\solrj-lib\commons-logging-1.0.4.jar;c:\apache-solr-1.3.0\dist\solrj-lib\commons-codec-1.3.jar getAB

import java.util.ArrayList;
import java.util.Collection;

import scala.xml.parsing.ConstructingParser;
import scala.io.Source;
import scala.xml.PrettyPrinter;

import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;
import org.apache.solr.common.SolrInputDocument;

object getAB {
def main(args : Array[String]) {

var solr = new CommonsHttpSolrServer("http://localhost:8983/solr");
val url = "http://webservice.recruit.co.jp/ab-road/spot/v1/?key=xxx4e359bbbbe6f4&spot=000921";

val data = Source.fromURL(url,"UTF-8");
val elem = ConstructingParser.fromSource(data,true).document().docElem;

var tmp1:String = (elem\"spot"\"description").text;
//var tmp1:String = new PrettyPrinter(80 /*width*/, 2 /*indent*/).format(elem);
//String変数(tmp1)から(UTF8エンコードな)バイトストリームで取り出し(そこから)UTF8のStringを作る
var tmp2:String = new String(tmp1.getBytes("UTF-8"),"UTF-8");
var tmp3:String = new String(tmp2.getBytes("MS932"),"MS932");

//System.out.println( "ORG:\n"+tmp1 );
System.out.println( "UTF8:\n"+tmp2 );
System.out.println( "SJIS:\n"+tmp3 );

var doc1 :SolrInputDocument = new SolrInputDocument();
doc1.addField("id", "id1", 1.0f);
doc1.addField("name", "doc1", 1.0f);
doc1.addField("price", 10);

var doc2 :SolrInputDocument = new SolrInputDocument();
doc2.addField("id", "id2", 1.0f);
doc2.addField("name", "doc2", 1.0f);
doc2.addField("price", 20);
doc2.addField("desc_t", tmp2);

var docs :Collection[SolrInputDocument] = new ArrayList[SolrInputDocument]();
docs.add(doc1);
docs.add(doc2);

solr.add(docs);
solr.commit();
}
}

お恥ずかしくも、Scalaっぽくはまったく無い書きっぷりですが、これでもJavaよりはだいぶ記述量が少ない気がします。

追伸:
 リクルートwebAPIを使うときのキーは、(ソースには)ダミーを入れています。