自分用の備忘録なので結構はしょります。後で記事にします。
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 で言うと、SimpleTextPostingEnum の readDoc が文書と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 を返してくれます。
最後に、CollectManager
の topDocs
を取得する部分までで、結果が取得されているのが分かると思います。
readDoc が見つかってから、DefaultBulkScorer を見つけるまで時間がかかったので備忘録として記事にした。
また時間があったら、まとめます。