Solr游标查询提高翻页效率
长期以来,我们一直有一个深分页问题。如果直接跳到很靠后的页数,查询速度会比较慢。这是因为Solr的需要为查询从开始遍历所有数据。直到Solr的4.7这个问题一直没有一个很好的解决方案。与最近发布的Solr的版本中,Solr使用了所谓的游标大幅度提高深翻页的性能。
问题
深分页的问题是很清楚。Solr必须为返回的搜索结果准备一个列表,并返回它的一部分。如果该部分来源于该列表的前面并不难。但如果我们想返回第10000页(每页20条记录)的数据,Solr需要准备一个包含大小为200000(10000
* 20)的列表。这样,它不仅需要时间,还需要内存。
令人高兴的是,Solr 4.7的发布改变了这一状况,引入了游标的概念。游标是一个动态结构,不需要存储在服务器上。游标包含了查询的结果的偏移量,因此,Solr的不再需要每次从头开始遍历结果直到我们想要的记录,游标的功能可以大幅提升深翻页的性能。但是是以消耗内存为代价的。(据个人测算10G的索引需要jvm为3.5G左右)。
用法
游标的使用非常简单。在第一个查询中,我们需要传递一个额外的参数- cursorMark = *,告诉Solr返回游标。在返回中除了搜索结果,我们还可以得到nextCursorMark信息。看看下面这个例子。
例如:
1.我们从一个简单的查询开始:
curl 'localhost:8983/solr/select?q=*:*&rows=1&sort=score+desc,id+asc&cursorMark=*
这里我们传入一个cursorMark = *参数,告诉Solr的,我们要使用的光标。
返回值除了平时返回的结果外,还多了一个游标数据nextCursorMark="AoIIP4AAACgwNTc5QjAwMg==",使用这个值作为我们翻下一页的参数。
2.下一页查询:
curl 'localhost:8983/solr/select?q=*:*&rows=1&sort=score+desc,id+asc&cursorMark=AoIIP4AAACgwNTc5QjAwMg=='
这样就查询出下一页数据,同样也返回了nextCursorMark参数。依次迭代即可实现翻页功能。
总结
Solr的4.7引入的这个游标参数非常简单,大大提升了翻页的效果
详细的测试报告看这里:
http://searchhub.org/2013/12/12/coming-soon-to-solr-efficient-cursor-based-iteration-of-large-result-sets
相关文章
- 程序员提升效率的10个技巧
- 【.NET6】gRPC服务端和客户端开发案例,以及minimal API服务、gRPC服务和传统webapi服务的访问效率大对决
- 关于java中redis操作直接使用jedis和使用springboot封装的RedisTemplate效率对比和主要区别
- JavaScript - 根据对象键名(属性)删除匹配项,移除对象的某个属性、键值对(2 种效率较高的解决方案)
- 效率提升多倍, 推荐值得收藏40 个命令总结
- 何不 Ack?Grep, Ack, Ag的搜索效率对比
- 2017GAITC丨朱小燕:人机对话能直接能减少90%人工,极大提升效率
- 提高 Vim 和 Shell 效率的 9 个建议
- 提升正则读写效率,超好用的正则图解工具Regulex与在线调试工具regexr
- 效率测试-----过期检测(毫秒级)
- 开发效率对大部分团队来说是首要的,因为你能快速出产品比什么都强
- 要提高SQL查询效率where语句条件的先后次序应如何写
- 浅析mybatis里的懒加载 - 通过懒加载来提高mybatis的查询效率
- MySQL大表拆分多个表的方式(横向拆分和纵向拆分)及如何解决跨表查询效率问题
- 【总结思考】如何提高项目的稳定性和开发效率
- 物联网将如何改善效率?
- 子查询in和表连接效率
- sql-如何提高SQL查询的效率?
- 修改SQL Server Management Studio 默认设置从而提高开发效率
- EF 数据查询效率对比
- 简述前端提高开发效率的发展历程
- SQL查询效率(Oracle)