2009-06-10 16 views
13

código que es como si tuviera existente:Migración de Hit/Visitas 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")); 
    // ... 
} 

No es claro cómo volver a escribir el código usando TopDocs/TopDocCollector y la forma de recorrer más de todo resultados.

Respuesta

24

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

Excepto Quiero que todos los resultados. (Quiero que funcione más como grep). –