有人可以帮助我了解在 Lucene 中使用抽象 Collector 类的自定义实现的方式吗?
我用一些测试文本实现了两种查询索引的方法:
1.Total hits is eq to 2. 两个文件名相同,因此结果大小为 eq to 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 是 eq 到 2。我在 Collector 的 collect 方法中从中获取文件名的两个文档都是唯一的,因此最终结果大小也是 eq 到 2。CountNextReader 变量在逻辑末尾是 eq 到 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 方法中与以前的实现相比,我得到不同的文档和不同的文件名?我希望得到相同的结果,或者?