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框架(九)——drf偏移分页组件、drf游标分页组件(了解)、自定义过滤器、过滤器插件django-filter
drf偏移分页组件 paginations.py from rest_framework.pagination import LimitOffsetPagination class MyLimitOf ...
- DRF url控制 解析器 响应器 版本控制 分页(常规分页,偏移分页,cursor游标分页)
url控制 第二种写法(只要继承了ViewSetMixin) url(r'^pub/$',views.Pub.as_view({'get':'list','post':'create'})), #获取 ...
- drf偏移分页组件-游标分页-自定义过滤器-过滤器插件django-filter
drf偏移分页组件 LimitOffsetPagination 源码分析:获取参数 pahenations.py from rest_framework.pagination import Limit ...
- Solr中使用游标进行深度分页查询以提高效率(适用的场景下)
通常,我们的应用系统,如果要做一次全量数据的读取,大多数时候,采用的方式会是使用分页读取的方式,然而 分页读取的方式,在大数据量的情况下,在solr里面表现并不是特别好,因为它随时可能会发生OOM的异 ...
- 关于ibatis进行物理游标分页
http://www.iteye.com/topic/136712 详细demo:参照http://www.kusoft.net 我的数据库是采用mssql2000 采用分页必定数据量比较大: 按照i ...
- solr研磨之facet
作者:战斗民族就是干 转载请注明地址:http://www.cnblogs.com/prayers/p/8822417.html Facet 开门见山,facet解决的就是筛选,我是把它理解为一种聚合 ...
- solr研磨之性能调优
作者:战斗民族就是干 转载请注明地址:http://www.cnblogs.com/prayers/p/8982141.html 本篇文章我们来了解一下solr的性能方面的调优,分为Schema优化 ...
- 电商项目搜寻功能(分页,高亮,solr,规格过滤,价格的排序)
package cn.wangju.core.service; import cn.wangju.core.pojo.item.Item; import cn.wangju.core.util.Con ...
- 8.1Solr API使用(分页,高亮)
转载请出自出处:http://www.cnblogs.com/hd3013779515/ 一.Solr Deep Paging(深分页) 长期以来,我们一直有一个深分页问题.如果直接跳到很靠后的页数, ...
随机推荐
- Linux内核线程
内核线程是直接由内核本身启动的进程.内核线程实际上是将内核函数委托给独立的进程,与系统中其他进程"并行"执行(实际上,也并行于内核自身的执行),内核线程经常被称为内核"守 ...
- HTML5中 HTML列表/块/布局 韩俊强的博客
从简单到复杂HTML5详解:每日更新关注:http://weibo.com/hanjunqiang 新浪微博! 1.HTML列表 1.有序 2.无序 3.有序star属性 4.有序无序列表 代码: ...
- java中hashCode()与equals()详解
首先之所以会将hashCode()与equals()放到一起是因为它们具备一个相同的作用:用来比较某个东西.其中hashCode()主要是用在hash表中提高 查找效率,而equals()则相对而言使 ...
- 微信公众平台开发者中心服务器配置Token验证失败问题
微信发展如火如荼,没有哪家的企业营销能避开微信不谈的,那像我们这种给客户实施项目的多多少少会涉及微信端的开发,本文只要给从未做过微信开发的人做一些简单的演示,行家里手们可以呵呵一下该干嘛干嘛去了. 微 ...
- 使用maven将项目打成jar包
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- 精通CSS+DIV网页样式与布局--制作实用菜单
在上篇博文中,小编中主要的简单总结了一下CSS中关于如何设置页面和浏览器元素,今天小编继续将来介绍CSS的相关基础知识,这篇博文,小编主要简单的总结一下在CSS中如何制作网页中的菜单,这部分的内容包括 ...
- 浅谈java异常
一. 异常的定义 在<java编程思想>中这样定义 异常:阻止当前方法或作用域继续执行的问题.虽然java中有异常处理机制,但是要明确一点,决不应该用"正常"的态度来看 ...
- Java进阶(三十三)java基础-filter
java基础-filter 我们先看看没有filter的时候,整个web客户端-服务端的一个流程. 接下来我们再看看引入了filter之后的Uml图.尝试分析这两者之间的差别. filter从哪里来? ...
- Java-IO之超类OutputStream
图中我们可以看出,以字节为单位的输出流的公共父类是OutputStream: 从中我们可以看出,以字节为单位的输出流的公共父类是OutputStream: (1)OutputStream是以字节为单位 ...
- Java学习从菜鸟变大鸟之一 hashCode()和equals()的本质区别和联系
在学习java,根据视频做实例的过程中,对equals和hashcode两个方法理解稍微深刻一点,主要是它们两个很容易混淆,容易出错,自己又通过网上的资料学习,和大家分享 equals()方法 equ ...