一、使用searchAfter完成分页查询
searchAfter()方法原理是获取上一页的最后一个元素和pageSize,再从最后一个元素的后一个开始取pageSize条数据,这就是需要展示的结果了。searchAfter()方法需要三个参数:ScoreDoc after, Query query, int n。after是上一页的最后一个scoreDoc,query是查询的内容,n是总条数。如果是第一页,scoreDoc传递null,这个需要特别注意。
二、searchAfter的例子
public void searchPageBySearchAfter(String queryString, int pageIndex, int pageSize) {
try {
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
QueryParser queryParser = new QueryParser(Version.LUCENE_35, "content", new StandardAnalyzer(Version.LUCENE_35));
Query query = queryParser.parse(queryString);
TopDocs topDocs = indexSearcher.search(query, pageIndex * pageSize);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
ScoreDoc scoreDoc;
int last = (pageIndex - 1) * pageSize - 1;
// 查询第一页的时候scoreDoc传null
if (last < 0) {
scoreDoc = null;
} else {
scoreDoc = scoreDocs[last];
}
topDocs = indexSearcher.searchAfter(scoreDoc, query, pageSize);
// 分页查询
for (ScoreDoc sd : topDocs.scoreDocs) {
Document document = indexSearcher.doc(sd.doc);
System.out.println(sd.doc + ":" + document.get("path") + " " + document.get("fileName"));
}
indexSearcher.close();
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}