作者:战斗民族就是干

转载请注明地址:http://www.cnblogs.com/prayers/p/8986498.html

  

普通分页

  当需要深度分页的时候,比如查询第10000页数据,每页显示10条,意味着需要提取前10000 x 10 页的数据,并将这100000条数据缓存在内存中,然后在内存中进行排序。最后返回最后10条即用户想要的第100000页数据。

  缺点:

  1、首先需要在内存缓存100000条数据需要占用大量的内存

  2、并且在内存中对100000条数据进行排序也非常消耗CPU

  因此普通分页方式比较适合返回TOPN条数据,翻页越翻到后面,分页查询性能越差,即使你开启了resultQueryCache

Cursor分页

  Solr中的游标是一个逻辑概念,它不会在服务器上存储任何信息,而是返回一个下一页数据起始位置”Mark”标记值给用户,该标记表示着当前分页起始位置在查询匹配的整个索引结果集中的绝对索引位置。

  想要在Solr中使用游标,你需要指定一个cursorMark参数比如:cursorMark=*,你可以理解为它跟start=0类似。 然后此时Solr除了会返回一个TopN的结果集,同时还附带返回一个nextCursorMark值, nextCursorMark表示游标下一次遍历的起始位置即下一次分页从nextCursorMark位置开始返回。 nextCursorMark值是查询匹配结果集中的数据索引位置的编码值,每一次分页查询都需要带上cursorMark参数即cursorMark=nextCursorMark值(第一页除外),你可以重复这个过程,直到Solr返回的nextCursorMark=cursorMark, 那么就表明此时已经没有下一页了

  注意

    1、cursorMark和start参数是互斥的,你不能同时指定这两个参数,或者也可以同时指定这两个参数,但是此时start参数必须等于零

    2、sort语句必须包含唯一主键域,如果id是你的主键域,那么sort参数可以像这样设置: sort=idasc,name asc。 但是你不能设置sort=name desc

    因为游标标记是根据结果集中每个索引文档的排序值进行计算出来的,这意味着如果两个文档的排序值相同,那么它们生成的游标值也是相同的,这个就是要求sort语句必须包含主键的原因

  使用用例如下:第一次分页必须使用cursorMark=*

http://localhost:8080/solr/b2b/select?q=cmmdtyName:手机&sort=id asc&fl=id,cmmdtyCode&wt=json&indent=true&cursorMark=*&rows=1

  返回结果集如下: 

{
responseHeader: {
status: 0,
QTime: 2
},
response: {
  numFound: 484,
  start: 0,
  docs: [
  {
    id: "P2_000000010207451749_0070173948",
    cmmdtyCode: "000000010207451749"
  }
  ]
},
  nextCursorMark: "AoE/AVAyXzAwMDAwMDAxMDIwNzQ1MTc0OV8wMDcwMTczOTQ4"
}

  查询下一页的用例:  

http://localhost:8080/solr/b2b/select?q=cmmdtyName:手机&sort=id asc&fl=id,cmmdtyCode&wt=json&indent=true&cursorMark=AoE/AVAyXzAwMDAwMDAxMDIwNzQ1MTc0OV8wMDcwMTczOTQ4&rows=1

  这里的cursorMark参数值, 它需要与上一次分页查询结果集里返回的nextCursorMark属性值保持一致,直到返回的nextCursorMark等于当前的cursorMark,也就表明分页到底了

  由于每一次请求下一页都需要上一页查询返回的nextCursonMark游标,所以无法实现指定页的查询请求,只能一页一页的翻下去,类似于链表

  

  

  

  

solr研磨之游标分页的更多相关文章

  1. DRF框架(九)——drf偏移分页组件、drf游标分页组件(了解)、自定义过滤器、过滤器插件django-filter

    drf偏移分页组件 paginations.py from rest_framework.pagination import LimitOffsetPagination class MyLimitOf ...

  2. DRF url控制 解析器 响应器 版本控制 分页(常规分页,偏移分页,cursor游标分页)

    url控制 第二种写法(只要继承了ViewSetMixin) url(r'^pub/$',views.Pub.as_view({'get':'list','post':'create'})), #获取 ...

  3. drf偏移分页组件-游标分页-自定义过滤器-过滤器插件django-filter

    drf偏移分页组件 LimitOffsetPagination 源码分析:获取参数 pahenations.py from rest_framework.pagination import Limit ...

  4. Solr中使用游标进行深度分页查询以提高效率(适用的场景下)

    通常,我们的应用系统,如果要做一次全量数据的读取,大多数时候,采用的方式会是使用分页读取的方式,然而 分页读取的方式,在大数据量的情况下,在solr里面表现并不是特别好,因为它随时可能会发生OOM的异 ...

  5. 关于ibatis进行物理游标分页

    http://www.iteye.com/topic/136712 详细demo:参照http://www.kusoft.net 我的数据库是采用mssql2000 采用分页必定数据量比较大: 按照i ...

  6. solr研磨之facet

    作者:战斗民族就是干 转载请注明地址:http://www.cnblogs.com/prayers/p/8822417.html Facet 开门见山,facet解决的就是筛选,我是把它理解为一种聚合 ...

  7. solr研磨之性能调优

    作者:战斗民族就是干  转载请注明地址:http://www.cnblogs.com/prayers/p/8982141.html 本篇文章我们来了解一下solr的性能方面的调优,分为Schema优化 ...

  8. 电商项目搜寻功能(分页,高亮,solr,规格过滤,价格的排序)

    package cn.wangju.core.service; import cn.wangju.core.pojo.item.Item; import cn.wangju.core.util.Con ...

  9. 8.1Solr API使用(分页,高亮)

    转载请出自出处:http://www.cnblogs.com/hd3013779515/ 一.Solr Deep Paging(深分页) 长期以来,我们一直有一个深分页问题.如果直接跳到很靠后的页数, ...

随机推荐

  1. 【编程练习】最近准备开始找工作,这篇文章作为一个code练手题目的总结吧

    找工作时候一般需要准备的算法题目类型,其实参考leetcode和poj或者剑指offer基本能够摆平大部分的题目了 1.图的遍历,BFS.DFS: 2.递归的回溯剪枝: 3.树的建立和遍历: 4.状态 ...

  2. Libgdx教程目录

    Libgdx教程 Note:本教程用的Libgdx 1.9.2版本,在教程更新完毕之前应该不会更新版本.之前的博客中也发表过Libgdx的内容,不过当时都从别人那里拷贝的,因此现在想做一个Libgdx ...

  3. java实现异步调用实例

    在JAVA平台,实现异步调用的角色有如下三个角色: 调用者 取货凭证   真实数据 一个调用者在调用耗时操作,不能立即返回数据时,先返回一个取货凭证.然后在过一断时间后凭取货凭证来获取真正的数据.  ...

  4. Android Service详解

    service作为四大组件值得我们的更多的关注 在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务.例如,一个从service播放音乐的音乐播放器,应 ...

  5. Nginx+PHP-FPM的域Socket配置方法

    1什么是域Socket "Unix domain socket 或者 IPCsocket 是一种终端,可以使同一台操作系统上的两个或多个进程进行数据通信.与管道相比,Unix domain ...

  6. Android初级教程之内容提供者获取联系人信息

    内容提供折详细理论知识请参考之前的博文:http://blog.csdn.net/qq_32059827/article/details/51646513 这里新建了三个联系人信息,通过查看系统联系人 ...

  7. 如何在Cocos2D游戏中实现A*寻路算法(六)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  8. Struts2进阶(一)运行原理及搭建步骤

    Struts2进阶(一)运行原理 Struts2框架 Struts2框架搭建步骤 致力于web服务,不可避免的涉及到编程实现部分功能.考虑使用到SSH框架中的Struts2.本篇文章只为深入理解Str ...

  9. mysql进阶(二十二)MySQL错误之Incorrect string value: '\xE7\x81\xAB\xE7\x8B\x90...中文字符输入错误

    MySQL错误之Incorrect string value: '\xE7\x81\xAB\xE7\x8B\x90...' for column 'tout' at row 1中文字符输入错误 在实验 ...

  10. N个数组中所有元素的排列组合(笛卡尔积)算法

    (1)N个数组对象中所有元素排列组合算法 private List<List<Object>> combineAlg(List<Object[]> nArray) ...