zoukankan      html  css  js  c++  java
  • lucene的两种分页操作

       基于lucene的分页有两种:

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

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

      

    	/**
    	 * 这就是先查询所有的数据,然后去分页数据
         * 注意 这种方式处理海量数据的时候,容易内存溢出
    	 * @param query
    	 * @param pageIndex--第几页
    	 * @param pageSize--每页显示多少数据
    	 */
    	public void searchPage(String query,int pageIndex,int pageSize) {
    		try {
    			Directory dir = FileIndexUtils.getDirectory();
    			IndexSearcher searcher = getSearcher(dir);
    			QueryParser parser = new QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35));
    			Query q = parser.parse(query);
    			TopDocs tds = searcher.search(q, 500);
    			//注意 此处把500条数据放在内存里。
    			ScoreDoc[] sds = tds.scoreDocs;
    			int start = (pageIndex-1)*pageSize;
    			int end = pageIndex*pageSize;
    			for(int i=start;i<end;i++) {
    				Document doc = searcher.doc(sds[i].doc);
    				System.out.println(sds[i].doc+":"+doc.get("path")+"-->"+doc.get("filename"));
    			}
    			
    			searcher.close();
    		} catch (org.apache.lucene.queryParser.ParseException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}


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

    	
    	/**
    	 * 根据页码和分页大小获取上一次的最后一个scoredocs
    	 * @param pageIndex
    	 * @param pageSize
    	 * @param query
    	 * @param searcher
    	 * @return
    	 * @throws IOException
    	 */
    	private ScoreDoc getLastScoreDoc(int pageIndex,int pageSize,Query query,IndexSearcher searcher) throws IOException {
    		if(pageIndex==1)return null;//如果是第一页就返回空
    		int num = pageSize*(pageIndex-1);//获取上一页的最后数量
    		TopDocs tds = searcher.search(query, num);
    		return tds.scoreDocs[num-1];
    	}
    	
    	public void searchPageByAfter(String query,int pageIndex,int pageSize) {
    		try {
    			Directory dir = FileIndexUtils.getDirectory();
    			IndexSearcher searcher = getSearcher(dir);
    			QueryParser parser = new QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35));
    			Query q = parser.parse(query);
    			//获取上一页的最后一个元素
    			ScoreDoc lastSd = getLastScoreDoc(pageIndex, pageSize, q, searcher);
    			//通过最后一个元素去搜索下一页的元素
    			TopDocs tds = searcher.searchAfter(lastSd,q, pageSize);
    			for(ScoreDoc sd:tds.scoreDocs) {
    				Document doc = searcher.doc(sd.doc);
    				System.out.println(sd.doc+":"+doc.get("path")+"-->"+doc.get("filename"));
    			}
    			searcher.close();
    		} catch (org.apache.lucene.queryParser.ParseException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}



    本文转载自hu948162999博客,版权归hu948162999所有

  • 相关阅读:
    [USACO5.3]校园网Network of Schools
    [USACO13OPEN]照片Photo

    flask的orm框架----------Flask-SQLAlchemy应用
    Flask-session用法
    flask--自定义auth模块
    flask -falsk_script用法
    Flask-SQLAlchemy数据库
    flask--session源码解析
    flask-源码请求源码
  • 原文地址:https://www.cnblogs.com/1130136248wlxk/p/5034425.html
Copyright © 2011-2022 走看看