0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Lucene が 結果を取得する様子を探ってみる

Last updated at Posted at 2022-11-01

自分用の備忘録なので結構はしょります。後で記事にします。

Lucene の IndexSearcher.search の createWeight は文書結果を取得しない。

createWeight は BM25 ? などで使う 統計情報を取得するだけで、マッチした文書の一覧取得までは行っていない。

SimpleTextCodec ですが ここら辺のコード を見れば、lastDocsStart しかインデックスしていないことが分かる。

            fstCompiler.add(
                Util.toIntsRef(lastTerm.get(), scratchIntsRef),
                outputs.newPair(
                    outputsOuter.newPair(lastDocsStart, skipPointer),
                    outputsInner.newPair((long) docFreq, totalTermFreq)));
          }

では、どこで 文書の取得を行っているのか?

Lucene の IndexSearcher.search は Score する部分で文書の取得を行っている。

SimpleTextCodec で言うと、SimpleTextPostingEnumreadDoc が文書とFrequencyの取得を行っている。

    private int readDoc() throws IOException {

この readDoc を while で実装した advance が呼ばれるのが、Weight.java の DefaultBulkScorer の score の scoreAll の中の for 文になる。

        for (int doc = iterator.nextDoc();
            doc != DocIdSetIterator.NO_MORE_DOCS;
            doc = iterator.nextDoc()) {
          if (acceptDocs == null || acceptDocs.get(doc)) {
            collector.collect(doc);
          }
        }

collector.collect(doc); の中身は ここ にあって、簡単に言えば

          pqTop.doc = doc + docBase;
          pqTop.score = score;
          pqTop = pq.updateTop();

pq という PriorityQueue というデータ構造に入ります。
PriorityQueue は、ここの初期化部分 を見れば分かりますが、ラムダ式を引数に取って、それを適用します。
なので、pq を初期化したときの HitQueue の ラムダ式を使い ScoreDoc を返してくれます。

最後に、CollectManagertopDocs を取得する部分までで、結果が取得されているのが分かると思います。


readDoc が見つかってから、DefaultBulkScorer を見つけるまで時間がかかったので備忘録として記事にした。
また時間があったら、まとめます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?