如何在lucene中实现分页?

nvs*_*ram 21 lucene

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

Kan*_*ane 21

您将需要应用自己的分页机制,类似于下面的内容.

 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));
 }
Run Code Online (Sandbox Code Playgroud)

你会发现迭代scoreDocs数组将是轻量级的,因为在调用searcher.Doc方法之前,索引中包含的数据并不真正使用.

请注意,此示例是针对Lucene.NET 2.3.2的略微修改版本编写的,但基本主体应该适用于任何最新版本的Lucene.


小智 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));
}
Run Code Online (Sandbox Code Playgroud)


Asi*_*zad 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;
    }
Run Code Online (Sandbox Code Playgroud)