土曜日, 9月 06, 2008

[Solr] DataImportHandler

Solrのv1.3がそろそろ公開されるか、という段階。で、そのお試しをしている中で、注目なのがDataImportHandler
データベースからSolrへのデータフィードを簡単にしようというところから始まったようだが、例題にあるようにHTTP経由でのデータ取込みがサポートされており、、、これをうまく拡張利用すれば簡単なロボット機能が作れそう(HTMLタグの削除は簡単そうだし)。

RSSの例題を試すまでの手順をメモ。
・Solr本体をダウンロードして展開(今はRC2)
・例題用のSchema.xmlなどが入ったexample/example-DIHがあることを確認
・Solr本体のexample/conf以下に、example-DIHディレクトリ内のrss/以下をコピー(上書き)
・exampleのところで"java -jar start.jar"
・(稼動確認)ブラウザから"http://xxx:8983/solr/dataimport"にアクセス
・(取込指示)ブラウザから"http://xxx:8983/solr/dataimport?command=full-import"にアクセス
・(動作確認)ブラウザから"http://xxx:8983/solr/dataimport"にアクセス(statusMessagesが追加されてるハズ)
・(結果確認)ブラウザから"http://xxx:8983/solr/select/?q=NASA&version=2.2&start=0&rows=10&indent=on&hl=on&hl.fl=description"にアクセス(このときNASAで検索した)
・ちなみにdelta-importとすると差分更新ができるみたい

仕組みの絵もWikiにありますがかなり考えられたつくりで、


transformerというのを指定すると、例えばDBなりWebから取り込んだデータを、よしなに加工してからSolrにフィードすることができ、そしてこのtransformerに指定する関数は、、1.6系のJavaであればJavascriptなど、別な言語が使えるそうです。至れり尽くせり。

月曜日, 9月 01, 2008

[Scala] CJKでも十分?(SpanScorer)

SpanScorerというので、確かにCJK利用時のハイライタが改善された。

◆SpanScorerの実行例(○)
D:\scala-2.7.0-final\bin\test>..\scala -classpath .;lucene3\lucene-core-2.4-dev.jar;lucene3\lucene-highlighter-2.4-dev.jar;lucene3\lucene-analyzers-2.4-dev.jar HighlightCJKSpan
このプログラムは酒造で合資の会社である、<B>酒造合資</B>会社の事業所で作成されました

◆QueryScorerの実行例(×)
D:\scala-2.7.0-final\bin\test>..\scala -classpath .;lucene3\lucene-core-2.4-dev.jar;lucene3\lucene-highlighter-2.4-dev.jar;lucene3\lucene-analyzers-2.4-dev.jar HighlightCJKQuery
このプログラムは<B>酒造で合資</B>の会社である、<B>酒造合資</B>会社の事業所で作成されました

Javaが書けないのでScalaで(ソースは以下)。

import org.apache.lucene.analysis._;

import org.apache.lucene.analysis.cjk._;

import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.highlight._;

import java.io._;

object HighlightCJKSpan {
val CONTENT = "このプログラムは酒造で合資の会社である、酒造合資会社の事業所で作成されました";
val QUERY_STRING = "酒造合資";
val F = "f";
//var analyzer: Analyzer = new NGramAnalyzer(1,3);
var analyzer: Analyzer = new CJKAnalyzer();

def main(args: Array[String]) {
try{
var qp :QueryParser = new QueryParser( F, analyzer );
var query :Query = qp.parse( QUERY_STRING );

//var scorer :Scorer = new QueryScorer( query, F );
var tokenStream :TokenStream = analyzer.tokenStream(F, new StringReader(CONTENT));
var scorer :SpanScorer = new SpanScorer( query, F, new CachingTokenFilter(tokenStream));

// println(tokenStream);
/*
var token :Token = tokenStream.next();
while(token != null){
println(token.termText());
token = tokenStream.next();
}
*/

var h :Highlighter = new Highlighter( scorer );
println( h.getBestFragment( analyzer, F, CONTENT ) );
} catch {
case e:StringIndexOutOfBoundsException => ()
case e:Exception => {
e.printStackTrace
}
} finally {
// println("FINALLY");
}
}
}

nagaShimaさんのページを参考にさせて頂きました。