想知道如何在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)
我使用以下方式进行分页,可能是对某人的帮助。如果您知道更好的策略,特别是从性能角度来看,请分享。
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)
| 归档时间: |
|
| 查看次数: |
15349 次 |
| 最近记录: |