2019独角兽企业重金招聘Python工程师标准>>>

我们先来看下下面的问题,现在我们的索引里有2亿多的数据,那么现在的需求是,把索引里的全部数据,读取然后写入txt文本里,对于这么一个量级的数据,显然是不可能一下子全部读取完的,那得要多大的内存才能够支持下来,是一个很恐怖的内存量,所以就引入散仙今天要给大家介绍的一个功能,Lucene的分页技术。

在介绍分页之前,我们先来看看上面的那个需求,不用分页的解决办法, 
其实在lucene里面,每一个索引都会对应一个不重复的docid,而这一点跟Oralce数据库的伪列rownum一样,恰恰正是由于这个docid的存在,所以让lucene在海量数据检索时从而拥有更好的性能,我们都知道Oracle数据库在分页时,使用的就是伪列进行分页,那么我的lucene也是一样,既然有一个docid的存在,那么上面的需求就很简单了。

方法一:依次根据每个docid获取文档然后写入txt中,这样的以来,就避免了内存不足的缺点,但是这样单条读取的话,速度上可能会慢一点,但能满足需求无可厚非。伪代码如下

    try{directory=FSDirectory.open(new File(indexReadPath));//打开索引文件夹IndexReader  reader=DirectoryReader.open(directory);//读取目录IndexSearcher search=new IndexSearcher(reader);//初始化查询组件for(int i=0;i<reader.numDocs();i++){//numDocs可能很大Document doc=search.doc(i);//依次获取每个docid对应的Document//可以在此部,做个批量操作,加快写入速度}  reader.close();//关闭资源directory.close();//关闭连接}catch(Exception e){e.printStackTrace();}

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);//初始化查询组件TopDocs all=search.search(new MatchAllDocsQuery(), 50000);int offset=0;//起始位置int pageSize=30;//分页的条数int total=30;//结束条数int z=0;while(z<=50){//总分页数System.out.println("==============================");pageScoreDocs(offset,total,search, all.scoreDocs);//调用分页打印offset=(z*pageSize+pageSize);//下一页的位置增量z++;//分页数+1;total=offset+pageSize;//下一次的结束分页量}reader.close();//关闭资源directory.close();//关闭连接}catch(Exception e){e.printStackTrace();}
public void pageScoreDocs(int offset,int total,IndexSearcher searcher,ScoreDoc[] doc) throws Exception{//System.out.println("offset:"+offset+"===>"+total);for(int i=offset;i<total;i++){//System.out.println("i"+i+"==>"+doc.length);if(i>doc.length-1){//当分页的长度数大于总数就停止break;}else{Document dosc=searcher.doc(doc[i].doc);System.out.println(dosc.get("name"));}}

最后我们来看下使用SearcherAfter进行分页的方式,代码如下:

    try{directory=FSDirectory.open(new File(indexReadPath));//打开索引文件夹IndexReader  reader=DirectoryReader.open(directory);//读取目录IndexSearcher search=new IndexSearcher(reader);//初始化查询组件int pageStart=0;ScoreDoc lastBottom=null;//相当于pageSizewhile(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();}

至此,我们已经了解了lucene中的分页技术,至于,我们在项目中该如何使用,都要根据我们的实际情况处理,因为分页技术常常会跟其他的,排序,过滤,评分等一些技术结合使用。

转载于:https://my.oschina.net/MrMichael/blog/220782

lucene4.7 分页(五)相关推荐

  1. 【狂神说】MySQL笔记

    公众号笔记 一.初识MySQL 表名/字段等名称用 ` tab上边的键 内容用 '元素' 二.数据库操作 三.DML语言 外键:相当于引入一个约束(CONSTRAINT) -- 创建外键的方式一 : ...

  2. DDK开发介绍_自我学习

    DDK开发介绍 2010-04-28 23:04:57|  分类: U盘 |  标签: |字号大中小 订阅 本篇我们介绍开发之前的准备工作,包括开发环境准备.预备知识. 开发环境准备 对于开发WDM驱 ...

  3. 【后端学习】后端技术要点总结【一】

    目录 一.SSM框架中Dao层,Mapper层,controller层,service层,model层,entity层都有什么作用 二.RESTfull 接口规范理解 三.SpringBoot事务 四 ...

  4. PHP应用-一揽子解决方案

    PHP1+MySQL数据库编程的步骤(七步骤,mysql_query() 执行语句,处理语句) 第一剑:PHP连接MySQL服务器 语法:resource mysql_connect ([ strin ...

  5. [面试题]自己边面试边总结的Java开发工程师笔记

    面经 业务背景题 计算机网网络 一.交换机和路由器有什么区别? 二.OSI七层参考模型 三.TCP/IP五层模型 四.tcp和udp的区别 五.TCP握手过程 为什么是4次 六.https 了解吗 七 ...

  6. MybatisPlus入门教程

    目录 一.MyBatis-Plus入门 1.简介 2.创建并初始化数据库 2.1创建数据库 2.2创建 User 表 3.确认idea配置 3.1 打开配置 3.2 Java编译器 3.3 项目和文件 ...

  7. 【操作系统 · 内存】内存管理

    内存管理 一.概述 二.需求 1. 重定位 2. 保护 3. 共享 4. 逻辑组织 5. 物理组织 三.分区 1. 固定分区 2. 动态分区 3. 伙伴系统 4. 重定位 四.分页 五.分段 一.概述 ...

  8. 奥斯汀页眉怎么设置_第3章 Word字处理知识点梳理

    第3章Word字处理知识点梳理 这里是一线老师多年累积的经验,梳理成知识体系后,所有操作题和选择题的知识点,可以理清知识的脉络,希望能够帮助到你们! Word字处理知识框架 一.Word文档 1.Wo ...

  9. 数据库学习实践(四、五)--分页浏览、查询数据

    数据库红皮书上的四.五个例子,反反复复看了五六遍.每一次看,都有每一次的收获.例子中有好多值得我们琢磨学习的地方. 下面说说我对这两个例子的理解. 一:分页显示:            利用recor ...

最新文章

  1. 黄聪:Wordpress 模版技术手册 - WordPress Theme Technical manuals
  2. jittor和pytorch生成网络对比之esrgan
  3. rhel6多台主机的HA集群,并实现增加仲裁盘和共享存储
  4. 联想电脑的一键换机软件——乐换机
  5. Python time localtime()方法
  6. python 代码命令大全-Python 命令行参数
  7. 第三方模块:Python3 OS 文件/目录方法
  8. 四个好看的table表格样式
  9. 在线ai伪原创文章生成助手
  10. qt5把qt_zh_CN.qm加载了,但QTextEdit的右键菜单仍然是英文,而QLineEdit的倒是中文。怎样设置使得QTextEdit的右键菜单是中文
  11. android分析审计工具,Android审计平台
  12. python 哪些比赛-国内数据挖掘比赛有哪些?
  13. 网易校招编程题目之牛牛分苹果
  14. 【C++实训】实训总结
  15. 区块链技术在银行业的运用
  16. 小程序开发之【前端开发】【学习第二节】【一】
  17. docker部署Tailscale的节点中继derper 纯 IP 无需域名
  18. 遥感动态监测的几个典型应用——附带示例数据
  19. 微软Dynamics CRM管理销售流程 客户一个都不会跑
  20. JVM之垃圾回收算法详解

热门文章

  1. DCMTK:类DcmSigned64bitVeryLong的测试程序
  2. VTK:可视化之AxisActor
  3. OpenCV在相机或图像中检测QR码的实例(附完整代码)
  4. C++Slow Sort慢排序的实现算法(附完整源码)
  5. C语言实现最小堆minheap(附完整源码)
  6. C++ Data语意学
  7. QT绘制饼状图,自定义切片。
  8. QT的QSplitter类的使用
  9. QML基础类型之string
  10. 众唱点歌机会显示无法连接服务器,目前众多厂商唱多的服务器附加存储缺点分析...