Lucene笔记13-Lucene的搜索-基于searchAfter的实现

一、使用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();
    }
}

 

你可能感兴趣的:(Lucene)