`
qindongliang1922
  • 浏览: 2171026 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117075
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:125421
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:59490
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71015
社区版块
存档分类
最新评论

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

    博客分类:
  • Solr
阅读更多


通常,我们的应用系统,如果要做一次全量数据的读取,大多数时候,采用的方式会是使用分页读取的方式,然而
分页读取的方式,在大数据量的情况下,在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();
    }







参考文档:

https://cwiki.apache.org/confluence/display/solr/Pagination+of+Results



有什么问题 可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。
本公众号的内容是有关搜索和大数据技术和互联网等方面内容的分享,也是一个温馨的技术互动交流的小家园

2
3
分享到:
评论

相关推荐

    solr搜索引擎支持分页

    在Solr中,分页主要通过`start`和`rows`参数来实现。`start`参数定义了从哪个文档开始返回结果,`rows`参数指定了返回结果的数量。例如,如果你想获取第一页的10条结果,可以设置`start=0`和`rows=10`。第二页则将`...

    基于Solr的多表join查询加速方法

    本文将围绕"基于Solr的多表join查询加速方法"这一主题,深入探讨如何在Solr中实现类似join的功能,并优化查询性能。 在Solr中模拟join操作通常有两种策略:嵌入式数据模型和外部数据源查询(ExternalFileField或...

    solr在SSM框架中使用(支持中文分词查询)

    总的来说,"solr在SSM框架中使用(支持中文分词查询)"这个项目展示了如何在Java Web环境中集成Solr,利用SSM框架的优势,实现高效的全文检索功能,尤其是对中文文本的支持,这在处理中文信息量大的网站或应用中显得...

    match-query-parser,在solr中使用不同的查询时间分析器搜索单个字段.zip

    在Solr中,查询解析是搜索过程中的关键环节,它决定了如何将用户的输入转换为对索引的精确查询。这篇博文的重点是`match-query-parser`,这是一个特殊的查询时间分析器,允许我们在特定字段上执行更精确的查询。 在...

    solr 的使用及安装

    本文将深入讲解 Solr 的使用及安装过程。 一、Solr 简介 Solr 基于 Lucene 库,提供了一个高度可配置和可扩展的平台,用于处理和索引大量数据,支持多种数据源,如文件、数据库等。其主要特性包括: 1. **全文搜索...

    Lucene5学习之分页查询

    总结来说,理解和掌握Lucene5中的分页查询对于进行高效全文检索开发至关重要。通过对源码的深入学习,我们可以更好地理解其工作原理,优化查询性能。同时,利用相关的工具,如Solr和Elasticsearch,可以进一步简化...

    solr中文解析器以及使用文档

    3. **配置Solr的中文解析器**:在Solr中使用IK Analyzer,需要在solrconfig.xml和schema.xml这两个配置文件中进行设置。首先,需要在solrconfig.xml中指定查询分析器和索引分析器为IK Analyzer;然后,在schema.xml...

    Solr 查询,索引

    在本文中,我们将深入探讨Solr的查询机制和索引过程,以及如何通过工具进行操作。 一、Solr查询机制 1. **查询语法**:Solr支持丰富的查询语法,包括标准查询解析器(Standard Query Parser)和Lucene查询语法。...

    solr6.5使用的IK分词

    5. **使用说明**: 提供的`说明.txt`文件中应包含关于如何使用IK分词器的详细指南,包括如何查询、如何调整分词策略等。请参照该文件进行操作。 通过以上步骤,你就可以在Solr 6.5中成功集成并使用IK分词器了。这将...

    easynet.solr开发与使用

    4. 查询:查询是Solr最主要的功能,Easynet.Solr对此进行了封装,提供了一套丰富的查询API,允许开发者构建复杂的查询条件,如布尔运算、范围查询、模糊查询等,返回的结果集还可以进行排序、分页等处理,满足多样化...

    使用java实现solr-7.1.0的api和solr最新支持的sql查询

    在实际应用中,你还需要考虑性能优化,如使用Solr的缓存机制、分页查询、查询过滤器(Filter Queries)等。同时,为了确保高可用性和可扩展性,可能需要在生产环境中部署分布式Solr集群,利用ZooKeeper进行集群管理...

    基于java-solr-geo空间坐标搜索、距离排序、分页

    基于solr-geo空间搜索 1、Solr的schema.xml配置 定义坐标field 2、Solr的data-config.xml配置 建立索引 3、java查询语法 坐标距离、分页、排序

    java进阶Solr从基础到实战

    在本套课程中,我们将全面的讲解Solr,从Solr基础到Solr高级,再到项目实战,基本上涵盖了Solr中所有的知识点。 主讲内容 章节一:Solr基础(上) 1. 环境搭建 2. 核心讲解 3. 数据导入 4. 各种中文分析器 章节二:...

    solr在java中使用总结

    通过以上步骤,我们可以成功地部署Solr并在Java应用程序中使用SolrJ进行数据索引和搜索。Solr的强大功能和灵活性使其成为构建高效搜索系统的一个优秀选择。无论是对于企业级应用还是个人项目,Solr都是一个值得深入...

    solr中cache综述

    这些缓存机制与`SolrIndexSearcher`紧密关联,`SolrIndexSearcher`是Solr中进行索引查询的核心组件。当`SolrIndexSearcher`被创建或销毁时,相应的缓存也会随之创建或清空。 #### 二、SolrCache接口实现类 Solr...

    Solr入门使用详解.zip

    本教程将深入探讨Solr的基本概念、安装配置、索引管理、查询操作以及solrJ库的使用,同时也涉及到了IK分词器的详细应用。 首先,让我们了解一下Solr的核心概念。Solr是基于Lucene的搜索服务器,它可以快速地处理...

    Solr(Cloudera)使用手册

    Collection是Solr中的数据存储单元,相当于关系数据库中的表。 ##### 创建路径与实例 1. **创建路径**:在根目录下创建一个用于存放Solr实例的目录,例如`/root/zhangsolr2`。 ```bash $ solrctl instanceDir --...

    solrdump:使用光标有效地导出SOLR文档

    向SOLR请求大量文档可能会导致深度分页问题: 当您希望从Solr中获取大量排序结果以馈入外部系统时,对于start或rows参数使用非常大的值可能会非常低效。 另请参阅:获取大量已排序的结果:游标作为增加“开始”参数...

    lucene简单介绍及solr搭建使用

    5. **导入数据**:使用Solr的Update API或SolrCloud的索引分发机制,将数据导入到Solr中进行索引。 6. **配置和优化**:根据业务需求调整Solr的配置,例如设置缓存策略、优化查询性能等。 **全文搜索** 全文搜索是...

Global site tag (gtag.js) - Google Analytics