2007年12月1日土曜日

Lucene2.3を見てみる

いつ出るのかわからないけど、かなり性能が改善しているようなので見てみた。

うれしい改善

  • Fieldつかいまわし(LUCENE-963)。これでDocumentも使い回せる。
  • Tokenつかいまわし(LUCENE-969)。Tokenizer内でTokenを使い回す。
  • IndexReader.reopen()(LUCENE-743)。Searcherを作り直さないで良いなら、かなり便利になる気がする。
とりあえず、Field使い回しと、Token使い回しをしてみた。どっちも簡単。

Field使い回し

フィールドの数だけFiledのインスタンスを作っておいて、Documentにaddしておく。
あとは、実際にインデックスにつっこみたい文書を、作っておいたフィールドにそれぞれ設定して、
IndexWriterにdocをaddすればいい。docに対してaddするのは最初だけで良い。

final Document doc = new Document();
final Field url = new Field("url", "", Field.Store.YES, Field.Index.UN_TOKENIZED, Field.TermVector.NO);
final Field title = new Field("title", "", Field.Store.NO, Field.Index.TOKENIZED, Field.TermVector.NO);


final Field desc = new Field("desc", "", Field.Store.NO, Field.Index.TOKENIZED, Field.TermVector.NO);
doc.add(url); doc.add(title); doc.add(desc);
for (Content c: clist) {
    url.setValue(c.url);
    title.setValue(c.title);
    desc.setValue(c.desc);
    indexWriter.add(doc);
}


Token使い回し

Tokenをコンストラクタで作っておいて、nextが呼ばれるたびにTokenに設定されている値を変えるだけ。
Termを書き換えるのに、termBufferを書き換えた方が良いようなのでそうしてみる。

final int len = term.length();
char[] buf = token.termBuffer();
if (buf.length < len) {
  buf = token.resizeTermBuffer(len);
}
term.getChars(0, len, buf, 0);
token.setTermLength(len);

まだベンチマークしてないから、どれだけ効果あるのか不明。


0 件のコメント:

コメントを投稿