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

Как достичь разбиения на страницы в люцине?

Удивительно, как достичь разбивки на страницы в Lucene, поскольку она по своей сути не поддерживает разбиение на страницы. Мне в основном нужно искать "10 лучших записей" (на основе некоторого параметра), затем "следующие 10 записей" и т.д. И в то же время я не хочу, чтобы Лютена засыпала память. Любой совет будет оценен по достоинству. Спасибо заранее.

4b9b3361

Ответ 1

Вам нужно будет применить свой собственный механизм подкачки, что-то похожее на приведенное ниже.

 IList<Document> luceneDocuments = new List<Document>();

 IndexReader indexReader = new IndexReader(directory);
 Searcher searcher = new IndexSearcher(indexReader);

 TopDocs results = searcher.Search("Your Query", null, skipRecords + takeRecords);
 ScoreDoc[] scoreDocs = results.scoreDocs;

 for (int i = skipRecords; i < results.totalHits; i++)
 {
      if (i > (skipRecords + takeRecords) - 1)
      {
           break;
      }

      luceneDocuments.Add(searcher.Doc(scoreDocs[i].doc));
 }

Вы обнаружите, что повторение массива scoreDocs будет легким, поскольку данные, содержащиеся в индексе, не используются до тех пор, пока не будет вызван метод searcher.Doc.

Обратите внимание, что этот пример был написан против слегка измененной версии Lucene.NET 2.3.2, но основной принцип должен работать против любой последней версии Lucene.

Ответ 2

Другая версия цикла, продолжающаяся с фрагментом кода Kane;

....................

ScoreDoc[] scoreDocs = results.scoreDocs;
int pageIndex = [User Value];
int pageSize = [Configured Value];

int startIndex = (pageIndex - 1) * pageSize;
int endIndex = pageIndex * pageSize;
endIndex = results.totalHits < endIndex? results.totalHits:endIndex;

for (int i = startIndex ; i < endIndex ; i++)
{
     luceneDocuments.Add(searcher.Doc(scoreDocs[i].doc));
}

Ответ 3

Я использую следующий путь для разбивки на страницы, возможно, это помогает кому-то. Если вы знаете лучшую стратегию, особенно из точки зрения производительности, поделитесь ею.

   public TopDocs search(String query, int pageNumber) throws IOException, ParseException {
        Query searchQuery = parser.parse(query);
        TopScoreDocCollector collector = TopScoreDocCollector.create(1000, true);

        int startIndex = (pageNumber - 1) * MyApp.SEARCH_RESULT_PAGE_SIZE;
        searcher.search(searchQuery, collector);

        TopDocs topDocs = collector.topDocs(startIndex, MyApp.SEARCH_RESULT_PAGE_SIZE);
        return topDocs;
    }