Mam niektóre dokumenty przechowywane w indeksie Lucene z polem docId. Chcę, aby wszystkie dokumenty były przechowywane w indeksie. Istnieje również problem. Liczba dokumentów wynosi około 300 000, więc wolałbym, aby te dokumenty były w kawałkach wielkości 500. Czy jest to możliwe?Czy można iterować dokumenty zapisane w Indeksie Lucene?
Odpowiedz
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...
}
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
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
Zostało to wycofane przez innego użytkownika, ale pierwotny edytor był poprawny, liveDocs może mieć wartość null – bcoughlan
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.
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);
Co się stanie, jeśli (reader.isDeleted (i)) brakuje? –
Bez sprawdzenia isDeleted(), wypisywalibyśmy id dla dokumentów, które zostały wcześniej usunięte – bajafresh4life
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. –