如何在lucene中实现分页?

时间:2009-06-08 07:31:58

标签: lucene

想知道如何在Lucene中实现分页,因为它本身并不支持分页。我基本上需要搜索“前10个条目”(基于某些参数)然后“下10个条目”等等。与此同时,我不希望Lucene占用记忆。 任何建议将不胜感激。 提前谢谢。

3 个答案:

答案 0 :(得分:20)

您需要应用自己的分页机制,类似于以下内容。

 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。

答案 1 :(得分:12)

循环的另一个版本,继续使用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));
}

答案 2 :(得分:5)

我使用以下方式进行分页,可能对某人有所帮助。如果您了解更好的策略,特别是从性能角度来看,请分享。

   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;
    }