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

lucene的两种分页操作 博客分类: 搜索引擎,爬虫 java

基于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();}}

面临海量数据分页时,一般搜索引擎不会有这种需求,百度默认支持76页数据。

lucene的两种分页操作

转载于:https://my.oschina.net/xiaominmin/blog/1597500

lucene的两种分页操作相关推荐

  1. bootstrap layui 两种分页的实现

    最近做的项目中后台界面用的layui框架,前台界面用的是boostrap框架,这就导致我在做分页的过程中要考虑前台两种分页的动态实现,现在我已经爬出这个坑了,哈哈,给大家分享一下,写的不好的地方请大家 ...

  2. SQL SERVER两种分页的存储过程介绍

    由于现在很多的企业招聘的笔试都会让来招聘的写一个分页的存储过程,有的企业甚至要求应聘者用两种方式实现分页,如果没有在实际项目中使用过分页,那么很多的应聘者都会出现一定的问题,下面介绍两种分页的方法. ...

  3. Allegro打散Group的两种方法操作指导

    Allegro打散Group的两种方法操作指导 Allegro可以建一个Group,也可以打散一个Group,当不需要器件,过孔走线等等以一个group形式体现,可以用下面的操作打散,具体操作如下 举 ...

  4. 使用OpenCV对图像进行两种平移操作(图像的尺寸变化与图像的尺寸不变)

    使用OpenCV对图像进行两种平移操作(图像的尺寸变化与图像的尺寸不变) 图像的平移操作是将图像的所有像素点进行水平或垂直方向上的移动. 平移操作分为两种类型:图像的尺寸变化与图像的尺寸不变.前者保证 ...

  5. lucene两个分页操作

    基于lucene两个分页: lucene3.5查询方式(每次查询所有记录,然后取当中部分记录.这样的方式用的最多),lucene官方的解释:因为我们的速度足够快. 处理海量数据时.内存easy内存溢出 ...

  6. Java的两种分页实现

    在后端开发时,查询结果返回的是list集合,而前端是要分页进行展示,这里就需要进行分页处理,以下介绍两种方法,供参考. 分页,处理好分页的参数:totalCount.pageSize 和 pageNo ...

  7. sql server两种分页方法

    方法一: --分页方法一 select top 10 OrderID,CustomerID, EmployeeID,OrderDate,ShippedDate,ShipName,ShipAddress ...

  8. 【TensorFlow】池化层max_pool中两种paddding操作

    max_pool()中padding参数有两种模式valid和same模式. Tensorflow的padding和卷积层一样也有padding操作,两种不同的操作输出的结果有区别: 函数原型max_ ...

  9. iOS开发 - 商品详情页两种分页模式,只提供思路和实现方式。

    上面的效果是商品详情页常用的两种模式,分页和不分页.首先请忽略博主懒得去写界面,真正的效果见下面: 不分页模式 分页模式 然后先来依次说明下原理: 分页模式:看着和下拉刷新上拉加载的时候像不像?没错, ...

最新文章

  1. 智能交通大数据及云应用平台解决方案
  2. Android Treble架构解析
  3. mysql for windows zip版安装
  4. JS中 window.location.search的作用
  5. Solr Facet技术的应用与研究
  6. java用一个方法对变量初始化_java中怎么给变量初始化?
  7. 语音识别控制设计之声控小汽车的实现
  8. Educoder Basemap和Seaborn 第一关:Seaborn
  9. vc++无进程式线程插入穿墙技术实现
  10. 设计模式之简单工厂,工厂方法和抽象工厂
  11. 响应式设计中的HTML5
  12. HTML问答页面模板,问答社区简单静态页面模板
  13. 操作系统 信号量机制
  14. tianmao项目的学习笔记
  15. 数据库中主键、超键、候选键、外键是什么?
  16. 置信区间(confidence interval)
  17. 如何才能从英语视频转换文字呢?
  18. VPP协议栈学习一:snd_wnd
  19. rust 模块/文件/project
  20. OPS TPS RPS 吞吐量 查询率 事物数目 每秒查询率 每秒处理事物数目

热门文章

  1. okhttp离线缓存_Android改造OkHttp离线缓存
  2. Spring Controller – Spring MVC控制器
  3. 什么是super?如何使用super调用超类构造函数?
  4. 0514JS练习:函数
  5. @SuppressWarnings
  6. Errors running builder 'DeploymentBuilder'
  7. IEC61850的Read请求报文件MMS PDU解码
  8. LeetCode 107. Binary Tree Level Order Traversal II
  9. 【To Do! 重点 正则表达式】LeetCode 65. Valid Number
  10. Leetcode 392.判断子序列