solr研磨之游标分页
作者:战斗民族就是干
转载请注明地址: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研磨之游标分页相关推荐
- DRF url控制 解析器 响应器 版本控制 分页(常规分页,偏移分页,cursor游标分页)...
url控制 第二种写法(只要继承了ViewSetMixin) url(r'^pub/$',views.Pub.as_view({'get':'list','post':'create'})), #获取 ...
- solr研磨之facet
作者:战斗民族就是干 转载请注明地址:http://www.cnblogs.com/prayers/p/8822417.html Facet 开门见山,facet解决的就是筛选,我是把它理解为一种聚合 ...
- oracle游标多线程,多线程jdbc游标分页查询原理 oracle和mysql分页
分页查询中如何使用多线程加快处理速度? 分页sql是拼起来的现在怎么优化可以提高展示速度:优化思路: 1.试试并发多线程访问,然后把多线程获取的结果合并在一起. 2.做索引,加快查询速度. 3.把经常 ...
- Sql Server 2012 分页方法分析(offset and fetch)
最近在分析 Sql Server 2012 中 offset and fetch 的新特性,发现 offset and fetch 无论语法的简洁还是功能的强大,都是相当相当不错的.其中 offse ...
- Django框架深入了解_04(DRF之url控制、解析器、响应器、版本控制、分页)(二)
解析器介绍: 所谓解析器,就是前端传过来的数据,后端可以解析,从request.data中取出来,默认的解析器配置是三种编码格式都可以取 回到顶部 解析器的作用: 根据请求头(content-type ...
- Django框架深入了解_04(DRF之url控制、解析器、响应器、版本控制、分页)(一)
阅读目录 一.url控制 基本路由写法:最常用 第二种写法:继承ModelViewSet 第三种写法:(自动生成路由,必须继承ModelViewSet) 二.解析器 前端不同的数据格式请求,后端解析得 ...
- Django Rest Framework源码剖析(七)-----分页
一.简介 分页对于大多数网站来说是必不可少的,那你使用restful架构时候,你可以从后台获取数据,在前端利用利用框架或自定义分页,这是一种解决方案.当然django rest framework提供 ...
- Django rest framework之限流Throttling、内置过滤功能及第三方过滤功能及分页Pagination
文章目录 1.限流Throttling 1.1.自定义频率类 1.1.1.编写频率类 1.1.2.全局使用 1.1.3.局部使用 1.2.内置频率类 1.2.1.根据用户ip限制 1.2.2.限制匿名 ...
- Django 基础(12)-Django drf 分页查询(批量查询)、自定义分页器
文章目录 Django drf 分页查询(批量查询) PageNumberPagination:普通分页 Django 自定义分页器 自定义批量查询的返回结构 LimitOffsetPaginatio ...
最新文章
- 罗田用好“大数据”力促扶贫更精准
- 个人学习进度(第十三周)
- jQuery 基金会和 Dojo 基金会合并:Open Web
- 线性代数拾遗(五):矩阵变换的应用
- 安卓应用安全指南 5.6.3 密码学 高级话题
- Inf2Cat, signability test failed.驱动编译出错
- java动态字段排序_Java8对多个字段排序
- NLP --- 隐马尔可夫HMM(极大释似然估计详解)
- Python模块的导入
- ubuntu etc文件夹在哪_嵌入式Linux开发学习之 Ubuntu 和 Windows 文件互传
- OneAlert 入门(三)——事件分析
- Solidity 教程系列2 - 地址类型介绍
- python3使用matplotlib绘制风速风向玫瑰图
- BMVC 2020 开幕,196篇论文73篇开源~
- 2020牛客国庆集训派对day3
- 真的,你不了解石家庄。
- 解决蓝牙耳机自动暂停播放音乐的问题
- QT运行时报错Gtk-Message: 20:31:49.219: Failed to load module “canberra-gtk-module
- 开始搞WinCE-------关于定制WinCE操作系统的大概步骤
- 给大家分享一个串口通信助手SSCOM
热门文章
- AI 一分钟 | 南京大学成立人工智能研究院;三星关联实体已收购 AI 搜索引擎创业公司Kngine的全部股份
- CTO 说了,如果发现谁用 kill -9 关闭程序就开除
- 面试官问:MySQL 的自增 ID 用完了,怎么办?
- 面试官:你能说说MyBatis拦截器原理吗?
- 对业务系统的监控 No.118
- 图像数据读取及数据扩增方法
- 90%的人会遇到性能问题,如何用1行代码快速定位?
- 谷歌又一部门震荡:半年2名副总出走,开发团队只剩一半
- LeCun点赞!GAN模型130毫秒生成动漫肖像!
- PyTorch实现,GitHub 4000星:这是微软开源的计算机视觉库