Zasadniczo musisz zdecydować o limicie liczby oczekiwanych rezultatów. Następnie wykonujesz iterację po wszystkich ScoreDoc
s w wynikowym TopDocs
.
final MAX_RESULTS = 10000;
final Term t = /* ... */;
final TopDocs topDocs = searcher.search(new TermQuery(t), MAX_RESULTS);
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
Document doc = searcher.doc(scoreDoc.doc)
// "FILE" is the field that recorded the original file indexed
File f = new File(doc.get("FILE"));
// ...
}
To jest w zasadzie to, co robi klasy Hits
, tylko ustawia limit na wyników, a jeśli iteracyjne przeszłość, a następnie wyszukiwanie jest powtarzane, który jest zwykle marnotrawstwo. Dlatego został przestarzały.
DODANO: Jeśli nie jest to ograniczenie, które można umieścić na liczbę wyników, należy użyć Hitcollector:
final Term t = /* ... */;
final ArrayList<Integer> docs = new ArrayList<Integer>();
searcher.search(new TermQuery(t), new HitCollector() {
public void collect(int doc, float score) {
docs.add(doc);
}
});
for(Integer docid : docs) {
Document doc = searcher.doc(docid);
// "FILE" is the field that recorded the original file indexed
File f = new File(doc.get("FILE"));
// ...
}
wyjątkiem Chcę wszystkie wyniki. (Chcę, żeby działał bardziej jak grep.) –