6

Lucene の抽象 Collector クラスのカスタマイズされた実装を操作する方法を理解するのに誰かが助けてくれますか?

テスト テキストを使用してインデックスをクエリする 2 つの方法を実装しました。

1.合計ヒット数は 2 に相当します。両方のファイル名が同じであるため、結果のサイズは 1 に等しくなります。

TopDocs topDocs = searcher.search(query, Integer.MAX_VALUE);
LOG.info("Total hits " + topDocs.totalHits);
ScoreDoc[] scoreDosArray = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : scoreDosArray) {
    Document doc = searcher.doc(scoreDoc.doc);
    String fileName = doc.get(FILENAME_FIELD);
    results.add(fileName);
}

2.CountCollect は 2 に相当します。コレクターの collect メソッドでファイル名を取得するドキュメントは両方とも一意であるため、最終結果のサイズも 2 に相当します。CountNextReader 変数はロジックの最後にあり、10 に相当します。

private Set<String> doStreamingSearch(final IndexSearcher searcher, Query query) throws IOException {
    final Set<String> results = new HashSet<String>();
    Collector collector = new Collector() {
        private int base;
        private Scorer scorer;
        private int countCollect;
        private int countNextReader;

        @Override
        public void collect(int doc) throws IOException {
            Document document = searcher.doc(doc);
            String filename = document.get(FILENAME_FIELD);
            results.add(filename);
            countCollect++;
        }

        @Override
        public boolean acceptsDocsOutOfOrder() {
            return true;
        }

        @Override
        public void setScorer(Scorer scorer) throws IOException {
            this.scorer = scorer;
        }

        @Override
        public void setNextReader(AtomicReaderContext ctx) throws IOException {
            this.base = ctx.docBase;
            countNextReader++;
        }

        @Override
        public String toString() {
            LOG.info("CountCollect: " + countCollect);
            LOG.info("CountNextReader: " + countNextReader);
            return null;
        }
    };
    searcher.search(query, collector);
    collector.toString();
    return results;
}

以前の実装と比較して、collect メソッド内で異なるドキュメントと異なるファイル名を取得する理由がわかりません。私は同じ結果を期待しますか、それとも?

4

1 に答える 1