Подтвердить что ты не робот

Можно ли перебирать документы, хранящиеся в индексе Lucene?

У меня есть некоторые документы, хранящиеся в индексе Lucene с полем docId. Я хочу, чтобы все индексы хранились в индексе. Существует также проблема. Количество документов составляет около 300 000, поэтому я бы предпочел получить эти документы в кусках размером 500. Возможно ли это сделать?

4b9b3361

Ответ 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 результатов менее чем за секунду. Согласен медленнее, но по крайней мере вы можете игнорировать удаленные документы, если вам нужна разбивка на страницы.