作者:战斗民族就是干

转载请注明地址: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. 安卓IPC机制之Binder详解

    IPC(Inter-Process Communication,跨进程通信)是指两个进程之间数据交换的过程,因此我们首先必须了解什么是进程,什么是线程. 进程:进程是正在运行的程序的实例,与程序相比, ...

  2. Postgre: How to import UUID function into Postgre 9.3

    1. Open a command console and go to the directory where you installed Postgre server. e.g. D:\Progra ...

  3. Android开发学习之路--网络编程之初体验

    一般手机都是需要上网的,一般我们的浏览器就是个webview.这里简单实现下下功能,先编写Android的layout布局: <?xml version="1.0" enco ...

  4. STL:set/multiset用法详解

    集合 使用set或multiset之前,必须加入头文件<set> Set.multiset都是集合类,差别在与set中不允许有重复元素,multiset中允许有重复元素. sets和mul ...

  5. [问与答]怎样在 Android Stuido中删除一个project

    sof Remove Project from Android Studio 问 第一次用Android Stuido,建立一个项目,却不知道怎么删除? 答 大概有3种方式 方式一 (简单实用) 点击 ...

  6. python爬虫 - python requests网络请求简洁之道

    http://blog.csdn.net/pipisorry/article/details/48086195 requests简介 requests是一个很实用的Python HTTP客户端库,编写 ...

  7. python调用数据库并查询

    http://blog.csdn.net/pipisorry/article/details/48024795 python调用数据库命令 conn = sqlite3.connect(". ...

  8. Leetcode_110_Balanced Binary Tree

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42218839 Given a binary tree, d ...

  9. shell重定向(大于号,小于号,左右,2>&1,&)

    本文的例子部分是引用网络上的一篇文章. Linux的IO输入输出有三类 Standard Input 代码 0 Standard Output 代码 1 Standard Error 代码 2 举个例 ...

  10. APP-FND-00676: 弹性域例程 FDFGDC 无法读取为此说明性弹性域指定的默认引用字段

    路径: AR: 设置- 财务系统 - 弹性域- 说明性 -注册 手工增加: RECEIPT_METHOD_ID 路径: AR: 设置- 财务系统 - 弹性域- 说明性 -段 路径:收款 - 收款 点  ...