Можно ли перебирать документы, хранящиеся в Lucene Index? - PullRequest
22 голосов
/ 22 февраля 2010

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

Ответы [ 5 ]

47 голосов
/ 24 февраля 2010
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...
}
17 голосов
/ 29 августа 2013

Люцен 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

6 голосов
/ 21 января 2016

Существует класс запроса с именем MatchAllDocsQuery, думаю, его можно использовать в этом случае:

Query query = new MatchAllDocsQuery();
TopDocs topDocs = getIndexSearcher.search(query, RESULT_LIMIT);
2 голосов
/ 22 февраля 2010

Номера документов (или идентификаторы) будут следующими числами от 0 до IndexReader.maxDoc () - 1. Эти числа не являются постоянными и действительны только для открытого IndexReader. Вы можете проверить, был ли документ удален с помощью метода IndexReader.isDeleted (int documentNumber)

0 голосов
/ 30 апреля 2015

Если вы используете .document (i), как в приведенных выше примерах, и пропускаете удаленные документы, будьте осторожны, если вы используете этот метод для разбивки на страницы результатов.То есть: у вас есть 10 документов на страницу и вам нужно получить документы.для страницы 6. Ваш ввод может быть примерно таким: смещение = 60, количество = 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");
}

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

...