天天看點

Lucene 05 - 使用Lucene的Java API實作分頁查詢

本文通過Lucene的API實作了分頁查詢.

目錄

  • 1 Lucene的分頁查詢
  • 2 代碼示例
  • 3 分頁查詢結果
  • 版權聲明

搜尋内容過多時, 需要考慮分頁顯示, 像這樣:

Lucene 05 - 使用Lucene的Java API實作分頁查詢

說明: Lucene的分頁查詢是在記憶體中實作的.

/**
 * 檢索索引(實作分頁)
 * @throws Exception 
 */
@Test
public void searchIndexByPage() throws Exception {
    // 1. 建立分析器對象(Analyzer), 用于分詞
    // Analyzer analyzer = new StandardAnalyzer();
    // 使用ik中文分詞器
    Analyzer analyzer = new IKAnalyzer();
    
    // 2. 建立查詢對象(Query)
    // bookName:lucene
    // 2.1 建立查詢解析器對象
    // 參數一: 指定一個預設的搜尋域
    // 參數二: 分析器
    QueryParser queryParser = new QueryParser("bookName", analyzer);
    // 2.2 使用查詢解析器對象, 執行個體化Query對象
    // 參數: 查詢表達式
    Query query = queryParser.parse("bookName:lucene");
    
    // 3. 建立索引庫目錄位置對象(Directory), 指定索引庫的位置
    Directory directory = FSDirectory.open(new File("/Users/healchow/Documents/index")); 
    
    // 4. 建立索引讀取對象(IndexReader), 用于讀取索引
    IndexReader reader = DirectoryReader.open(directory);
    
    // 5. 建立索引搜尋對象(IndexSearcher), 用于執行搜尋
    IndexSearcher searcher = new IndexSearcher(reader);
    
    // 6. 使用IndexSearcher對象, 執行搜尋, 傳回搜尋結果集TopDocs
    // search方法: 執行搜尋
    // 參數一: 查詢對象
    // 參數二: n - 指定傳回排序以後的搜尋結果的前n個
    TopDocs topDocs = searcher.search(query, 10);
    
    // 7. 處理結果集
    // 7.1 列印實際查詢到的結果數量
    System.out.println("實際查詢的結果數量: "+topDocs.totalHits);
    // 7.2擷取搜尋的結果數組
    // ScoreDoc中: 有我們需要的文檔的id, 有我們需要的文檔的評分
    ScoreDoc[] scoreDocs = topDocs.scoreDocs;
    
    // 增加分頁實作 ========= start
    // 目前頁
    int page = 2;
    // 每頁的大小
    int pageSize = 2;
    // 計算記錄起始數
    int start = (page - 1) * pageSize;
    // 計算記錄終止數 -- 得到資料索引與實際結果數量中的最小值, 防止數組越界
    // 資料索引: start + pageSize
    // 實際的結果數量: scoreDocs.length
    int end = Math.min(start + pageSize, scoreDocs.length);
    // 增加分頁實作 ========= end
    
    for(int i = start; i < end; i++){
        System.out.println("= = = = = = = = = = = = = = = = = = =");
        // 擷取文檔Id和評分
        int docId = scoreDocs[i].doc;
        float score =scoreDocs[i].score;
        System.out.println("文檔Id: " + docId + " , 文檔評分: " + score);
        // 根據文檔Id, 查詢文檔資料 -- 相當于關系資料庫中根據主鍵Id查詢
        Document doc = searcher.doc(docId);
        
        System.out.println("圖書Id: " + doc.get("bookId"));
        System.out.println("圖書名稱: " + doc.get("bookName"));
        System.out.println("圖書價格: " + doc.get("bookPrice"));
        System.out.println("圖書圖檔: " + doc.get("bookPic"));
        System.out.println("圖書描述: " + doc.get("bookDesc"));
    }
    // 8. 釋放資源
    reader.close();
}
           

這裡查詢到的結果共有3條, 是以第2頁隻有一條結果:

Lucene 05 - 使用Lucene的Java API實作分頁查詢

作者: 馬瘦風

出處: 部落格園 馬瘦風的部落格

您的支援是對部落客的極大鼓勵, 感謝您的閱讀.

本文版權歸部落客所有, 歡迎轉載, 但請保留此段聲明, 并在文章頁面明顯位置給出原文連結, 否則部落客保留追究相關人員法律責任的權利.

繼續閱讀