有人可以幫助我找到一種方法來處理Lucene中抽象收集器類的自定義實現嗎?Lucene索引自定義收集器的工作方式
我已經實現了一些測試文本查詢索引的方法有兩種:
1.Total命中被eq至2兩個文件名相同,因此導致大小EQ爲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。從我得到的文件名中收集的收集方法,這兩個文件都是獨一無二的,因此最終結果大小也情商爲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;
}
我不明白的收集方法中,爲什麼我在以前的實現比較得到不同的文件和不同的文件名?我希望得到相同的結果,或?
這個也是我注意到的,調用Collector#collect的次數與第一次執行返回的次數相同......我的疑惑是爲什麼我在通過scoreDosArray迭代時得到不同的文檔或在收集器方法中檢索文檔......這最終會影響不同的結果,這些結果實際上是文件名,作爲集合返回。 – damax 2013-03-22 13:15:42
明白了,我沒有得到這部分的問題。你忘了考慮'docBase'。看看我更新的答案。 – javanna 2013-03-22 14:05:02
是的,添加doc + docBase解決了問題!我會考慮與收藏家有關的其他評論和建議。感謝您提供寶貴意見。 – damax 2013-03-22 14:18:36