1. 程式人生 > >Lucene筆記13-Lucene的搜尋-基於searchAfter的實現

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();
    }
}