По сути, вы должны принять решение об ограничении количества ожидаемых результатов. Затем вы перебираете все ScoreDoc
s в полученном 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" ) );
// ...
}
Это в основном то, что делает класс Hits
, только он устанавливает ограничение на 50 результатов, и если вы повторяете его, поиск повторяется, что обычно расточительно. Вот почему это устарело.
ДОБАВЛЕНО : Если нет ограничения на количество результатов, вы должны использовать 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" ) );
// ...
}