lucene两种分页,在solr我还没测试过

基于lucene的分页有两种:

   lucene3.5之前分页提供的方式为再查询方式(每次查询全部记录,然后取其中部分记录,这种方式用的最多),lucene官方的解释:由于我们的速度足够快。处理海量数据时,内存容易内存溢出。

   lucene3.5以后提供一个searchAfter,这个是在特大数据量采用(亿级数据量),速度相对慢一点,像google搜索图片的时候,点击更多,然后再出来一批。这种方式就是把数据保存在缓存里面。然后再去取。
以下是再查询部分代码:

  
[java]  view plain copy
  1. /** 
  2.  * 这就是先查询所有的数据,然后去分页数据 
  3.     * 注意 这种方式处理海量数据的时候,容易内存溢出 
  4.  * @param query 
  5.  * @param pageIndex--第几页 
  6.  * @param pageSize--每页显示多少数据 
  7.  */  
  8. public void searchPage(String query,int pageIndex,int pageSize) {  
  9.     try {  
  10.         Directory dir = FileIndexUtils.getDirectory();  
  11.         IndexSearcher searcher = getSearcher(dir);  
  12.         QueryParser parser = new QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35));  
  13.         Query q = parser.parse(query);  
  14.         TopDocs tds = searcher.search(q, 500);  
  15.         //注意 此处把500条数据放在内存里。  
  16.         ScoreDoc[] sds = tds.scoreDocs;  
  17.         int start = (pageIndex-1)*pageSize;  
  18.         int end = pageIndex*pageSize;  
  19.         for(int i=start;i<end;i++) {  
  20.             Document doc = searcher.doc(sds[i].doc);  
  21.             System.out.println(sds[i].doc+":"+doc.get("path")+"-->"+doc.get("filename"));  
  22.         }  
  23.           
  24.         searcher.close();  
  25.     } catch (org.apache.lucene.queryParser.ParseException e) {  
  26.         e.printStackTrace();  
  27.     } catch (IOException e) {  
  28.         e.printStackTrace();  
  29.     }  
  30. }  


   最后我们来看下使用SearcherAfter进行分页的方式,代码如下(lucene3.5之前 不支持该方法):

[java]  view plain copy
  1. /** 
  2.  * 根据页码和分页大小获取上一次的最后一个scoredocs 
  3.  * @param pageIndex 
  4.  * @param pageSize 
  5.  * @param query 
  6.  * @param searcher 
  7.  * @return 
  8.  * @throws IOException 
  9.  */  
  10. private ScoreDoc getLastScoreDoc(int pageIndex,int pageSize,Query query,IndexSearcher searcher) throws IOException {  
  11.     if(pageIndex==1)return null;//如果是第一页就返回空  
  12.     int num = pageSize*(pageIndex-1);//获取上一页的最后数量  
  13.     TopDocs tds = searcher.search(query, num);  
  14.     return tds.scoreDocs[num-1];  
  15. }  
  16.   
  17. public void searchPageByAfter(String query,int pageIndex,int pageSize) {  
  18.     try {  
  19.         Directory dir = FileIndexUtils.getDirectory();  
  20.         IndexSearcher searcher = getSearcher(dir);  
  21.         QueryParser parser = new QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35));  
  22.         Query q = parser.parse(query);  
  23.         //获取上一页的最后一个元素  
  24.         ScoreDoc lastSd = getLastScoreDoc(pageIndex, pageSize, q, searcher);  
  25.         //通过最后一个元素去搜索下一页的元素  
  26.         TopDocs tds = searcher.searchAfter(lastSd,q, pageSize);  
  27.         for(ScoreDoc sd:tds.scoreDocs) {  
  28.             Document doc = searcher.doc(sd.doc);  
  29.             System.out.println(sd.doc+":"+doc.get("path")+"-->"+doc.get("filename"));  
  30.         }  
  31.         searcher.close();  
  32.     } catch (org.apache.lucene.queryParser.ParseException e) {  
  33.         e.printStackTrace();  
  34.     } catch (IOException e) {  
  35.         e.printStackTrace();  
  36.     }  
  37. }  

你可能感兴趣的:(lucene两种分页,在solr我还没测试过)