2010-02-22 8 views

Odpowiedz

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

Co się stanie, jeśli (reader.isDeleted (i)) brakuje? –

+0

Bez sprawdzenia isDeleted(), wypisywalibyśmy id dla dokumentów, które zostały wcześniej usunięte – bajafresh4life

+0

Aby zakończyć komentarz z góry. Zmiany indeksu są dokonywane po ponownym otwarciu indeksu, więc read.isDeleted (i) jest konieczne do zagwarantowania, że ​​dokumenty są ważne. –

2

Numery dokumentów (lub identyfikatory) będą kolejnymi numerami od 0 do IndexReader.maxDoc() - 1. Te liczby nie są trwałe i są poprawne tylko dla otwartego IndexReader. Można sprawdzić, czy dokument został usunięty z IndexReader.isDeleted (int documentNumber) Metoda

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 na tej stronie o szczegóły: https://lucene.apache.org/core/4_0_0/MIGRATE.html

+0

Zostało to wycofane przez innego użytkownika, ale pierwotny edytor był poprawny, liveDocs może mieć wartość null – bcoughlan

0

Jeśli użyjesz .document (i) jak w powyższych przykładach i pominiesz usunięte dokumenty, zachowaj ostrożność, jeśli użyjesz tej metody do dzielenia wyników na strony. tzn .: Masz 10 dokumentów/listę stron i musisz pobrać dokumenty. dla strony 6. Twój wkład może wyglądać mniej więcej tak: offset = 60, count = 10 (dokumenty od 60 do 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"); 
} 

Będziesz mieć pewne problemy z usuniętych, ponieważ nie powinno się rozpocząć od offset = 60, ale z offset = 60 + liczba usuniętych dokumentów, które pojawiają się przed 60.

alternatywnego znalazłem jest coś takiego:

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); 

uwaga: zamienić tekst pomiędzy [[]] z wartościami własnymi. Zrobiłem to na dużym indeksie z wpisami 1,5 miliona i otrzymałem losowe 10 wyników w mniej niż sekundę. Zgadzam się wolniej, ale przynajmniej możesz zignorować usunięte dokumenty, jeśli potrzebujesz stronicowania.

4

istnieje klasa o nazwie MatchAllDocsQuery zapytania, myślę, że może on być stosowany w tym przypadku:

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