博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
lucene的两种分页操作
阅读量:4706 次
发布时间:2019-06-10

本文共 2437 字,大约阅读时间需要 8 分钟。

   基于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
"+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所有

转载于:https://www.cnblogs.com/1130136248wlxk/p/5034425.html

你可能感兴趣的文章
[NYIST15]括号匹配(二)(区间dp)
查看>>
json_value.cpp : fatal error C1083: 无法打开编译器生成的文件:No such file or directory
查看>>
洛谷 P1101 单词方阵
查看>>
Swift DispatchQueue
查看>>
C#和JAVA 访问修饰符
查看>>
小甲鱼OD学习第1讲
查看>>
HDU-1085 Holding Bin-Laden Captive-母函数
查看>>
php提示undefined index的几种解决方法
查看>>
LRJ
查看>>
Struts2环境搭建
查看>>
Linux: Check version info
查看>>
stl学习之测试stlen,cout等的运行速度
查看>>
魔戒三曲,黑暗散去;人皇加冕,光明归来
查看>>
Error和Exception
查看>>
Python和Singleton (单件)模式[转载]
查看>>
httpclient设置proxy与proxyselector
查看>>
IT常用单词
查看>>
拓扑排序
查看>>
NYOJ--32--SEARCH--组合数
查看>>
gulpfile 压缩模板
查看>>