Lucene4.3开发之插曲之斗转星移
Lucene的分页,总的来说有两种形式,散仙总结如下图表格。(如果存在不合适之处,欢迎指正!)
从上图我们可以分析出,ScoreDocs适合在数据量不是很大的场景下进行分页,而SearchAfter则都适合,所以,我们要根据自己的业务需求,合理的选出适合自己的分页方式。
在我们了解这2中分页技术的优缺点之后,我们再来探讨下上面那个读2亿数据存入txt文本里,在这里,SocreDocs不适合这种场景,当然如果你内存足够大的话,可以尝试下,通用分页分批读取的方式,可以提升我们的写入效率,效果是比单条单条读取的速度是要快很多的。虽然ScoresDocs的分页方式在本需求上不适合,但是作为示例,下面散仙给出使用ScoreDocs进行分页的代码:
Lucene的分页,总的来说有两种形式,散仙总结如下图表格。(如果存在不合适之处,欢迎指正!)
编号 | 方式 | 优点 | 缺点 |
1 | 在ScoresDocs里进行分页 | 无需再次查询索引,速度很快 | 在海量数据时,会内存溢出 |
2 | 利用SearchAfter,再次查询分页 | 适合大批量数据的分页 | 再次查询,速度相对慢一点,但可以利用缓存弥补 |
从上图我们可以分析出,ScoreDocs适合在数据量不是很大的场景下进行分页,而SearchAfter则都适合,所以,我们要根据自己的业务需求,合理的选出适合自己的分页方式。
在我们了解这2中分页技术的优缺点之后,我们再来探讨下上面那个读2亿数据存入txt文本里,在这里,SocreDocs不适合这种场景,当然如果你内存足够大的话,可以尝试下,通用分页分批读取的方式,可以提升我们的写入效率,效果是比单条单条读取的速度是要快很多的。虽然ScoresDocs的分页方式在本需求上不适合,但是作为示例,下面散仙给出使用ScoreDocs进行分页的代码:
- try{
- directory=FSDirectory.open(new File(indexReadPath));//打开索引文件夹
- IndexReader reader=DirectoryReader.open(directory);//读取目录
- IndexSearcher search=new IndexSearcher(reader);//初始化查询组件
- int pageStart=0;
- ScoreDoc lastBottom=null;//相当于pageSize
- while(pageStart<10){//这个只有是paged.scoreDocs.length的倍数加一才有可能翻页操作
- TopDocs paged=null;
- paged=search.searchAfter(lastBottom, new MatchAllDocsQuery(),null,30);//查询首次的30条
- if(paged.scoreDocs.length==0){
- break;//如果下一页的命中数为0的情况下,循环自动结束
- }
- page(search,paged);//分页操作,此步是传到方法里对数据做处理的
- pageStart+=paged.scoreDocs.length;//下一次分页总在上一次分页的基础上
- lastBottom=paged.scoreDocs[paged.scoreDocs.length-1];//上一次的总量-1,成为下一次的lastBottom
- }
- reader.close();//关闭资源
- directory.close();//关闭连接
- }catch(Exception e){
- e.printStackTrace();
- }
No comments:
Post a Comment