Básicamente, debe decidir un límite en la cantidad de resultados que espera. Luego itera sobre todos los ScoreDoc
s en el TopDocs
resultante.
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"));
// ...
}
Esto es básicamente lo que hace la clase Hits
, sólo que establece el límite en resultados, y si iterar pasado que, a continuación, la búsqueda se repite, que suele ser un desperdicio. Por eso fue desaprobado.
AÑADIDO: Si no hay un límite que puede poner en el número de los resultados, se debe utilizar un 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"));
// ...
}
Excepto Quiero que todos los resultados. (Quiero que funcione más como grep). –