我正在使用Lucene 4.2,并正在执行结果分页。
IndexSearcher.searchAfter提供了一种实现“下一页”功能的有效方法,但是实现“上一页”甚至“转到页面”功能的最佳方法是什么?例如,没有IndexSearcher.searchBefore

我正在考虑在给定页面大小的情况下确定页面总数,并保留一个ScoreDoc[]数组来跟踪每个页面的“after” ScoreDoc(在分页结果时将填充该数组)。这将允许我在ScoreDoc中使用“最接近”的IndexSearcher.searchAfter(在最坏的情况下为null)。

这有意义吗?有没有更好的方法?

最佳答案

我一直在使用Lucene 4.8,并且一直在研究包括分页的REST接口(interface)。
我的解决方案是使用TopScoreDocCollector并调用topDocs(int startIndex,int numberOfhits)方法。起始索引是通过从零开始的页数乘以点击数来计算的。

...
DirectoryReader reader = DirectoryReader.open(MMapDirectory.open( java.io.File(indexFile) );
IndexSearcher searcher = new IndexSearcher(reader);
TopScoreDocCollector collector = TopScoreDocCollector.create(MAX_RESULTS, true);  // MAX_RESULTS is just an int limiting the total number of hits
int startIndex = (page -1) * hitsPerPage;  // our page is 1 based - so we need to convert to zero based
Query query = new QueryParser(Version.LUCENE_48, "All", analyzer).parse(searchQuery);
searcher.search(query, collector);
TopDocs hits = collector.topDocs(startIndex, hitsPerPage);
...

因此,我的REST界面接受页数和每页的点击数作为参数。
因此,前进或后退就像提交一个具有适当值的新请求一样简单

08-28 16:19