2010-02-22 4 views

Antwort

42
IndexReader reader = // create IndexReader 
for (int i=0; i<reader.maxDoc(); i++) { 
    if (reader.isDeleted(i)) 
     continue; 

    Document doc = reader.document(i); 
    String docId = doc.get("docId"); 

    // do something with docId here... 
} 
+1

Was passiert, wenn (reader.isDeleted (i)) fehlt? –

+0

Ohne die isDeleted() - Prüfung würden Sie IDs für Dokumente ausgeben, die zuvor gelöscht wurden – bajafresh4life

+0

Um einen Kommentar von oben abzuschließen. Indexänderungen werden beim erneuten Öffnen des Indexes festgelegt, daher ist reader.isDeleted (i) erforderlich, um die Gültigkeit der Dokumente zu gewährleisten. –

2

Dokumentennummern (oder IDs) sind Folgezahlen von 0 bis IndexReader.maxDoc() - 1. Diese Nummern sind nicht persistent und nur für geöffneten IndexReader gültig. Sie könnten prüfen, ob das Dokument mit IndexReader.isDeleted (int Document) -Methode

14

Lucene 4

Bits liveDocs = MultiFields.getLiveDocs(reader); 
for (int i=0; i<reader.maxDoc(); i++) { 
    if (liveDocs != null && !liveDocs.get(i)) 
     continue; 

    Document doc = reader.document(i); 
} 

See LUCENE-2600 auf dieser Seite für Details gelöscht: https://lucene.apache.org/core/4_0_0/MIGRATE.html

+0

Dies wurde von einem anderen Benutzer zurückgesetzt, aber der ursprüngliche Editor war korrekt. LiveDocs können null sein – bcoughlan

0

Wenn Sie .document (i) wie in den obigen Beispielen verwenden und gelöschte Dokumente überspringen, sollten Sie vorsichtig sein, wenn Sie diese Methode zum Paginieren von Ergebnissen verwenden. d. H .: Sie haben eine Liste mit 10 Dokumenten/pro Seite und Sie müssen die Dokumente abrufen. für Seite 6. Ihre Eingabe könnte etwa so aussehen: Offset = 60, Count = 10 (Dokumente von 60 bis 70).

IndexReader reader = // create IndexReader 
for (int i=offset; i<offset + 10; i++) { 
    if (reader.isDeleted(i)) 
     continue; 

    Document doc = reader.document(i); 
    String docId = doc.get("docId"); 
} 

Sie werden einige Probleme mit den gelöschten haben, weil Sie nicht von offset = 60 beginnen soll, aber von offset = 60 + die Anzahl der gelöschten Dokumente, die vor erscheinen 60.

Eine Alternative gefunden: ist etwas wie das:

is = getIndexSearcher(); //new IndexSearcher(indexReader) 
    //get all results without any conditions attached. 
    Term term = new Term([[any mandatory field name]], "*"); 
    Query query = new WildcardQuery(term); 

    topCollector = TopScoreDocCollector.create([[int max hits to get]], true); 
    is.search(query, topCollector); 

    TopDocs topDocs = topCollector.topDocs(offset, count); 

hinweis: ersetze text zwischen [[]] mit eigenen werten. Ließ dies auf großen Index mit 1,5 Millionen Einträge und bekam zufällige 10 Ergebnisse in weniger als einer Sekunde. Zustimmen ist langsamer, aber Sie können gelöschte Dokumente zumindest ignorieren, wenn Sie Seitenumbrüche benötigen.

4

Es wird eine Abfrage Klasse mit dem Namen MatchAllDocsQuery, ich glaube, es kann in diesem Fall verwendet werden:

Query query = new MatchAllDocsQuery(); 
TopDocs topDocs = getIndexSearcher.search(query, RESULT_LIMIT);