阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Solr中如何使用游标进行深度分页查询

246次阅读
没有评论

共计 2354 个字符,预计需要花费 6 分钟才能阅读完成。

通常,我们的应用系统,如果要做一次全量数据的读取,大多数时候,采用的方式会是使用分页读取的方式,然而分页读取的方式,在大数据量的情况下,在 solr 里面表现并不是特别好,因为它随时可能会发生 OOM 的异常,在 solr 里面通过 rows 和 start 参数,非常方便分页读取,但是如果你的 start=1000000 rows=10,那么 solr 里面会将前面 100 万元数据的索引信息读取在内存里面,这样以来,非常耗内存,所以在 solr 里面,分页并不适合深度分页。

深度分页在 solr 里面,更推荐使用游标的方式,游标是无状态的,不会维护索引数据在内存里面,仅仅记录最后一个 doc 的计算值类似 md5,然后每一次读取,都会如此记录最后一个值的 mark,下一次通过这个 mark 便能快速的定位到第二页上,如此往复,便能完成整个数据的读取。而且耗费内存非常少。

假如现在有排好队的 10 个人等待买饭,而一个房间里面最多一次只能进 2 个人,那么我们就可以将这个 2 个人,编号顺序,1 和 2,他们打完饭后,让 2 号的人通知,下一组 2 个人,进来打饭,如此往复所有人都能吃到饭,这就类似 solr 中游标的使用。

使用游标的方式读取数据,也有一些约束或者缺点:

(1)查询条件里面必须有 cursorMark 参数,而且必须不能有 start 参数

(2)查询的条件里必须按照主键排序(升序或降序),如果没有这个条件,主键重复,那么会造成多个游标的 mark 值,这样以来下一次请求就不知道如何定位了,而且有可能出现重复读数据的情况

(3)如果一个分页的系统,按照指定页码跳转的功能,这样实现的功能是实现不了的,因为游标一旦读取了,就不能再返回上一次的位置了,这种业务最好使用 start+rows 搞定。

solrj 实现代码例子:

// 游标查询
    public static void cursorQuery()throws Exception{
            //http solr 服务
            HttpSolrClient sc=new HttpSolrClient(“http://localhost:8983/solr/one”);
            //solr 查询封装
            SolrQuery sq =new SolrQuery();
                sq.setRows(2);// 设置游标一次读的数量
                sq.set(“q”, “*:*”);// 按条件检索
                sq.setSort(“id”, ORDER.asc);// 根据主键排序
                String cursorMark = CursorMarkParams.CURSOR_MARK_START;// 游标初始化
                boolean done = false;
                while (!done) {
                    sq.set(CursorMarkParams.CURSOR_MARK_PARAM, cursorMark);// 变化游标条件
                    QueryResponse rsp = sc.query(sq);// 执行多次查询读取
                    String nextCursorMark = rsp.getNextCursorMark();// 获取下次游标
                    // 做一些操作数据的事   
                    for(SolrDocument sd:rsp.getResults()){
                        System.out.println(sd.get(“id”));
                    }
                    // 如果两次游标一样,说明数据拉取完毕,可以结束循环了
                    if (cursorMark.equals(nextCursorMark)) {
                        done = true;
                    }
                    cursorMark = nextCursorMark;
                }
                // 关闭连接
                sc.close();
    }

Solr3.6.1 在 Tomcat6 下的环境搭建 http://www.linuxidc.com/Linux/2013-01/77664.htm

基于 Tomcat 的 Solr3.5 集群部署 http://www.linuxidc.com/Linux/2012-12/75297.htm

在 Linux 上使用 Nginx 为 Solr 集群做负载均衡 http://www.linuxidc.com/Linux/2012-12/75257.htm

Linux 下安装使用 Solr http://www.linuxidc.com/Linux/2012-10/72029.htm

在 Ubuntu 12.04 LTS 上通过 Tomcat 部署 Solr 4 http://www.linuxidc.com/Linux/2012-09/71158.htm

Solr 实现 Low Level 查询解析(QParser)http://www.linuxidc.com/Linux/2012-05/59755.htm

基于 Solr 3.5 搭建搜索服务器 http://www.linuxidc.com/Linux/2012-05/59743.htm

Solr 3.5 开发应用教程 PDF 高清版 http://www.linuxidc.com/Linux/2013-10/91048.htm

Solr 4.0 部署实例教程 http://www.linuxidc.com/Linux/2013-10/91041.htm

Solr 的详细介绍 :请点这里
Solr 的下载地址 :请点这里

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-03/129536.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计2354字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中