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