金曜日, 8月 29, 2008

[Scala] Luceneのハイライタ(NGramTokenizer)

NGramTokenizerをScalaでやってみました。

import org.apache.lucene.analysis.Analyzer;

import org.apache.lucene.analysis.ngram.NGramTokenizer;

import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.Scorer;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.TextFragment;

import java.io.Reader;

object HighlightRunner {
val CONTENT = "東京特許許可局";
val QUERY_STRING = "許可";
val F = "f";
var analyzer: Analyzer = new NGramAnalyzer(1,3);

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 h :Highlighter = new Highlighter( scorer );
println( h.getBestFragment( analyzer, F, CONTENT ) );
} catch {
case e:StringIndexOutOfBoundsException => ()
case e:Exception => {
e.printStackTrace
}
} finally {
// println("FINALLY");
}
}
}

// http://blog.goo.ne.jp/13th-floor/e/f694fdb1319134b40e4dee5ed8c15a92
class NGramAnalyzer(minGram:Int, maxGram:Int) extends Analyzer {
def tokenStream(fieldName:java.lang.String, reader:java.io.Reader): org.apache.lucene.analysis.TokenStream =
new NGramTokenizer(reader, minGram, maxGram);
}