• Elasticsearch分页


    Elasticsearch的数据都存在每个节点的分片中,当执行搜索时每个分片独立搜索后,数据再经过整合返回。ElasticSearch的搜索请求一次请求最大量为10000。如果超过则会发生错误。那么,如果数据量很大,就必须实现分页查询。Elasticsearch中分页方式大致有两种:from-size分页以及Scroll分页

    from-size分页

    from-size分页可以理解为简单意义上的分页。它的原理很简单,就是查询前200条数据,然后截断前100条,只返回100-200的数据。这样如果每页的数据很多的话会存在很大的资源浪费。

    查询方式如下:

    SearchResponse response = client.prepareSearch("test_index")
                    .setTypes("test").setFrom(10)
                    .setSize(20).setQuery(builder)
                    .execute().actionGet();
    

    其中,from定义了目标数据的偏移值,size定义当前返回的数目。默认from为0,size为10,即所有的查询默认仅仅返回前10条数据。这种查询方式的缺点是越往后的分页,执行效率越低。随着from的增加,消耗时间也会增加。而且数据量越大,效果越明显!也就是说,分页的偏移值越大,执行分页查询时间就会越长!

    Scroll分页

    Scroll API像传统数据库里的cursors(游标),可以允许我们检索大量数据(甚至全部数据),它允许我们做一个初始阶段搜索并且持续批量从Elasticsearch里拉取结果直到没有结果剩下。相对于from-size的分页来说,使用scroll可以模拟一个传统数据的游标,记录当前读取的文档信息位置。这个分页的用法,不是为了实时查询数据,而是为了一次性查询大量的数据(甚至是全部的数据)。因为这个scroll相当于维护了一份当前索引段的快照信息,这个快照信息是你执行这个scroll查询时的快照。在这个查询后的任何新索引进来的数据,都不会在这个快照中查询到。但是它相对于from-size,不是查询所有数据然后剔除不要的部分,而是记录一个读取的位置,保证下一次快速继续读取

    	SearchResponse searchResponse = client.prepareSearch()
                    .setIndices("")
                    .setTypes("")
                    .setScroll(TimeValue.timeValueMinutes(1)) //游标维持时间
                    .setSearchType(SearchType.SCAN)//用Scan提高性能,但第一次不返回结果,返回scrollId
                    .setSize(1000)//实际返回的数量为1000*index的主分片数
                    .execute()
                    .actionGet();
    
            TimeValue timeValue = new TimeValue(80000);
            while(true) {
                try {
                    //第一次查询,只返回数量和一个scrollId
                    //注意第一次运行没有结果
                    for (SearchHit hit : searchResponse.getHits().getHits()) {
                        //
                    }
                    //使用上次的scrollId继续访问
                    //初始搜索请求和每个后续滚动请求返回一个新的滚动ID,只有最近的滚动ID才能被使用
                    searchResponse = client.prepareSearchScroll(searchResponse.getScrollId()).setScroll(timeValue).execute().actionGet();
    
                    if (searchResponse.getHits().getHits().length == 0) {
                        break;
                    }
                } catch (Exception e) {
    
                }
            }
    
  • 相关阅读:
    vue.js中created方法作用
    UasyUi的各种方法整理
    echarts 3.8.4: tree设置节点与节点之间连线的颜色,可以独立每条线分开设置
    echarts中的树形结构图(参数分析)
    echarts y轴数据如果太大就会造成坐标轴显示不完全的问题
    echarts 网络拓扑告警闪烁及提示信息自定义
    echarts 树图问题
    echarts grid多格显示问题
    echarts中自定义tooltip的换行问题
    yarn install 安装报错问题
  • 原文地址:https://www.cnblogs.com/senlinyang/p/8336649.html
Copyright © 2020-2023  润新知