2009-06-10 12 views
13

Ho codice che è come esistente:Migrazione da Hit/visitatori a TopDocs/TopDocCollector

final Term t = /* ... */; 
final Iterator i = searcher.search(new TermQuery(t)).iterator(); 
while (i.hasNext()) { 
    Hit hit = (Hit)i.next(); 
    // "FILE" is the field that recorded the original file indexed 
    File f = new File(hit.get("FILE")); 
    // ... 
} 

Non è chiaro per me come riscrivere il codice utilizzando TopDocs/TopDocCollector e come per iterare oltre tutti risultati.

risposta

24

Fondamentalmente, devi decidere un limite al numero di risultati che ti aspetti. Quindi si itera su tutti gli ScoreDoc s nel risultante 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")); 
    // ... 
} 

Questo è fondamentalmente ciò che la classe Hits fa, solo che fissa il limite a 50 risultati, e se eseguire iterazioni passato che, allora la ricerca si ripete, che di solito è uno spreco. Ecco perché è stato deprecato.

AGGIUNTO: Se non c'è un limite si può mettere sul numero dei risultati, è necessario utilizzare 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")); 
    // ... 
} 
+0

Tranne che voglio tutti i risultati. (Voglio che funzioni più come grep.) –