2009-06-10 3 views
13

Mam istniejący kod, który jest jak:Migracja z Hit/Odsłon do 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")); 
    // ... 
} 

To nie jest dla mnie jasne, w jaki sposób przepisać kod za pomocą TopDocs/TopDocCollector i jak iteracyjne nad wszystko wyników.

Odpowiedz

24

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")); 
    // ... 
} 
+0

wyjątkiem Chcę wszystkie wyniki. (Chcę, żeby działał bardziej jak grep.) –