使用cursorMark做深度分页来解决solr普通分页时查询效率低的问题-jmeter、solr

        前一阵压测某项目,需要批量的接口测试数据(可以从solr中根据查询条件提取),大概需要100万条。于是使用solr常用的普通分页方式来抓取数据,发现在随着start值的增大,solr返回数据响应时间越来越慢(由500ms最后上升到10秒多)且开始报错,数据才抓取10多万条。这样获取肯定不行,于是对查询条件进行了优化(使用cursorMark 游标方式),查询效率立马提高N倍,且不会随着执行时间的增长而导致请求耗时变长。

下面为具体的详细示例:

优化前(普通分页方式)

请求返回耗时如下:

请求页面信息

优化后(cursorMark 游标方式)

请求返回耗时如下:

 请求页面信息

使用JSON Extrator提取cursorMark 值(Solr的返回结果中会有nextCursorMark,在下次调用时简单地使用这个值作为cursorMark以继续结果集的分页

 迭代轮询请求页面

--------------------------------------------------------------------------------------------

参考内容:

solr使用cursorMark做深度分页_stevesun13的博客-CSDN博客

  • 深度分页 是指给搜索结果指定一个很大的起始位移。

  • 普通分页 在给定一个大的起始位移时效率十分低下,例如start=1000000,rows=10的查询,搜索引擎需要找到前1000010条记录然后再返回最后10条。Solr为了最后10条记录只会检索排序字段,但是前1000010条记录的内部排序开销依然十分大。普通分页基础上的深度分页对分布式搜索引擎而言甚至是更低效的,因为为了找到正确的10条记录,来自各个分片的前1000010条记录的排序字段需要被返回和聚合在一个聚合节点。
  • 使用cursorMark(游标记录)

cursorMark参数允许高效地在大结果集上遍历。它可以在单点或分布式搜索引擎上工作。

  • 怎样使用cursorMark:

1.排序必须包括id字段的严格排序策略,这防止了用lucene记录id做内部排序导致的排序中存在相等的情况。
2.任何包括cursorMark的调用start字段必须是0。
3.第一次请求时传递cursorMark=*。
4.Solr的返回结果中会有nextCursorMark,在下次调用时简单地使用这个值作为cursorMark以继续结果集的分页

  • 深度分页curosrMark实现时要注意的点:

1.cursorMark参数自身包含了所有的必要状态,没有服务端的状态。
2.start参数总是返回0,这取决于客户端指出要展示的是什么位置。
3.没必要使用cursorMark排序到底,因为服务端没有保存状态,随时都可以终止排序。
4.你有两种方法知道搜索结果的排序到底了,没有返回和你请求的一样的行数,或者返回的coursorMark和你传递的一样(此时返回的行数为0)。
5.尽管start参数必须是0,每次调用都可以变换row值。
6.修改返回字段和facet字段时,cursorMark也是可以重用的。
7.客户端可以通过再次提交之前的cursorMark高效地往回翻页。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值