У меня есть некоторые документы, хранящиеся в индексе Lucene с полем docId. Я хочу, чтобы все индексы хранились в индексе. Существует также проблема. Количество документов составляет около 300 000, поэтому я бы предпочел получить эти документы в кусках размером 500. Возможно ли это сделать?
Можно ли перебирать документы, хранящиеся в индексе Lucene?
Ответ 1
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...
}
Ответ 2
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);
}
Подробнее см. LUCENE-2600 на этой странице: https://lucene.apache.org/core/4_0_0/MIGRATE.html
Ответ 3
Существует класс запроса MatchAllDocsQuery
, я думаю, что он может быть использован в этом случае:
Query query = new MatchAllDocsQuery();
TopDocs topDocs = getIndexSearcher.search(query, RESULT_LIMIT);
Ответ 4
Номера документов (или идентификаторы) будут следующими номерами от 0 до IndexReader.maxDoc() - 1. Эти номера не являются постоянными и действительны только для открытого IndexReader. Вы можете проверить, удален ли документ с помощью метода IndexReader.isDeleted(int documentNumber).
Ответ 5
Если вы используете .document(i), как в приведенных выше примерах, и пропустите удаленные документы, будьте осторожны, если вы используете этот метод для разбивки на страницы. т.е. у вас есть список из 10 документов/на страницу, и вам нужно получить документы. для страницы 6. Ваш ввод может быть примерно таким: offset = 60, count = 10 (документы от 60 до 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");
}
У вас будут проблемы с удаленными, потому что вы не должны начинать с offset = 60, но из offset = 60 + количество удаленных документов, которые появляются до 60.
Альтернатива, которую я нашел, выглядит примерно так:
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);
Примечание: замените текст между [[]] собственными значениями. Раньше это по большому индексу с 1,5 миллионами записей и получило случайные 10 результатов менее чем за секунду. Согласен медленнее, но по крайней мере вы можете игнорировать удаленные документы, если вам нужна разбивка на страницы.