es中3种分页的介绍以及对比

这篇具有很好参考价值的文章主要介绍了es中3种分页的介绍以及对比。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一 es的3种分页对比

1.1 先上结论

类型

原理

优点

缺点

使用场景

from + size

类似 msql的 limit 0,100;  limit  from,size

灵活性好,实现简单,适合浅分页

无法实现深度分页问题,当查询数量超过10000就会报错

top10000以内的查询

Scroll

首次查询会在内存中保存一个历史快照以及游标(scroll_id),记录当前消息查询的终止位置,下次查询的时候将基于游标进行消费(不管while语句循环多少次,scrollid在设置的时效内,使用的是同一个),不具备实时性,一般是用于大量数据导出。

适合深分页

无法反应数据的实时性(快照版本),维护成本高,需要维护一个 scroll_id

最适合离线场景,海量数据的导出(比如笔者刚遇到的将es中20w的数据导入到excel),需要查询海量结果集的数据

Search After

step1:在查询第1页的时候,设置全局唯一性的字段进行组合排序;step2:查询数据之后,取出最后一笔数据的sort值,传到search_after进行查询;

step3:基于上一笔的sort值,查询排在它之后的数据,以此来实现分页

性能最好,适合深分页,能够反映数据的实时变更

不能够随机跳转分页,只能是一页一页的向后翻(当有新数据进来,也能实时查询到),并且需要至少指定一个唯一不重复字段来排序(一般是_id和时间字段)   

海量数据的实时分页

二  es的深度分页介绍

2.1 scroll分页

由于项目现场涉密,所写代码,只能截图还原;

1.初始化客户端

es 分页,elasticsearch,es,elasticsearch,大数据,搜索引擎

2.scroll查询数据

es 分页,elasticsearch,es,elasticsearch,大数据,搜索引擎

 2.参考此代码

 /**
     * 这种常用于根据筛选条件之后抽取全部数据的场景,
     * scroll API 可以被用来检索大量的结果, 甚至所有的结果 ,
     * 注意es的游标查询的是当下时刻的数据快照,
     * 即在游标查询之后的数据的变动不会影响游标查询的结果,
     * 默认游标查询根据_doc字段进行排序
     *
     * @param restHighLevelClient
     * @param indexName
     * @param typeName
     * @throws IOException
     */
    public static void cusorSearch(RestHighLevelClient restHighLevelClient, String indexName, String typeName) throws IOException {
        SearchRequest searchRequest = new SearchRequest(indexName, typeName);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().query(QueryBuilders.rangeQuery("price").gte(5.0).lte(100.0));
        searchSourceBuilder.size(2);
        searchRequest.source(searchSourceBuilder);
        Scroll scroll = new Scroll(timeValueMillis(1L));
        /**
         *
         * 在搜索条件之后使用searchSourceBuilder.size(2)设置了每次游标只抽取2条数据,
         * 设置每次游标的超时时间是1毫秒timeValueMillis,可以适当调高超时时间防止由于超时还没查完导致游标提前结束。
         * 在执行游标的时候,第一次使用了客户端的search方法,从第二次开始使用scroll方法,
         * 每开始下一次游标的时候都通过查看本次游标的结果是否为空searchResponse.getHits().getHits()来判断是否还要继续,
         * 把每次游标的返回结果收集起来拿到全部数据
         *
         */
        searchRequest.scroll(scroll);
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        String scrollId = searchResponse.getScrollId();
        SearchHit[] hits = searchResponse.getHits().getHits();
        List<SearchHit> resultSearchHit = new ArrayList<>();
        while (hits != null && hits.length > 0) {
            System.out.println(hits.length);
            System.out.println(scrollId);
            resultSearchHit.addAll(Arrays.asList(hits));
            SearchScrollRequest searchScrollRequest = new SearchScrollRequest(scrollId);
            searchScrollRequest.scroll(scroll);
            SearchResponse searchScrollResponse = restHighLevelClient.scroll(searchScrollRequest, RequestOptions.DEFAULT);
            scrollId = searchScrollResponse.getScrollId();
            hits = searchScrollResponse.getHits().getHits();
        }
        ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
        clearScrollRequest.addScrollId(scrollId);
        restHighLevelClient.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
        restHighLevelClient.close();
    }

 3.RestHighLevelClient 操作ElasticSearch-CSDN博客

2.2 search After分页

1.代码截图

es 分页,elasticsearch,es,elasticsearch,大数据,搜索引擎

 2.参考代码

public static void main(String[] args) throws Exception{
        long startTime = System.currentTimeMillis();
        // 创建ES客户端
        RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );
        // 1、创建searchRequest
        SearchRequest searchRequest = new SearchRequest("audit2");
        // 2、指定查询条件
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder().trackTotalHits(true);//必须加上track_total_hits,不然就只显示10000
        //设置每页查询的数据个数
        sourceBuilder.size(1000);
        // 设置唯一排序值定位
        sourceBuilder.sort(SortBuilders.fieldSort("operationtime").order(SortOrder.DESC));//多条件查询
        //将sourceBuilder对象添加到搜索请求中
        searchRequest.source(sourceBuilder);
        // 发送请求
        SearchResponse searchResponse = esClient.search(searchRequest, RequestOptions.DEFAULT);
        SearchHit[] hits1 = searchResponse.getHits().getHits();
        List<Map<String, Object>> result = new ArrayList<>();
        if (hits1 != null && hits1.length > 0) {
            do {
                for (SearchHit hit : hits1) {
                    // 获取需要数据
                    Map<String, Object> sourceAsMap = hit.getSourceAsMap();
                    result.add(sourceAsMap);
                }
                // 取得最后得排序值sort,用于记录下次将从这个地方开始取数
                SearchHit[] hits = searchResponse.getHits().getHits();
                Object[] lastNum = hits[hits.length - 1].getSortValues();
                // 设置searchAfter的最后一个排序值
                sourceBuilder.searchAfter(lastNum);
                searchRequest.source(sourceBuilder);
                // 进行下次查询
                searchResponse = esClient.search(searchRequest, RequestOptions.DEFAULT);
            } while (searchResponse.getHits().getHits().length != 0);
        }
        logger.info("查询出来的数据个数为:{}", result.size());
        // 关闭客户端
        esClient.close();
        logger.info("运行时间: " + (System.currentTimeMillis() - startTime) + "ms");
    }

【es】java使用es中三种查询用法from size、search after、scroll_es from size_致最长的电影的博客-CSDN博客

2.3 search After模拟前端分页查询 

原理:每次查询本次最后一条数据的sort值存储起来,返回给前端,下一页的时候,携带此sort值,开启下一页查询,传给searchBuilder。searchAfter(xxx)。

截图代码第1部分

es 分页,elasticsearch,es,elasticsearch,大数据,搜索引擎

截图代码第2部分

es 分页,elasticsearch,es,elasticsearch,大数据,搜索引擎

 3.调用

es 分页,elasticsearch,es,elasticsearch,大数据,搜索引擎

 4.es查询

es 分页,elasticsearch,es,elasticsearch,大数据,搜索引擎

 文章来源地址https://www.toymoban.com/news/detail-775288.html

 

到了这里,关于es中3种分页的介绍以及对比的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Oracle 三种分页方法

    Oracle的三层分页指的是在进行分页查询时,使用三种不同的方式来实现分页效果,分别是使用ROWNUM、使用OFFSET和FETCH、使用ROW_NUMBER() OVER() 1.使用ROWNUM ROWNUM是Oracle中一个伪列,它用于表示返回的行的序号。使用ROWNUM进行分页查询的方法是在SELECT语句中加入WHERE子句,并在WHERE子

    2024年02月15日
    浏览(33)
  • mybatisplus的几种分页方式

    官方文档中给出了几种分页方式,挨个举例说明一下 这三种 Mybatis Plus 分页方式的区别主要在于传递参数的方式和返回结果的类型。 IPage selectPageVo(IPage? page, Integer state) 这种方式需要传入一个 IPage 对象作为分页参数,其泛型类型可以是任何实体类。方法返回值也是一个 IPage 对

    2024年02月07日
    浏览(36)
  • Elasticsearch实战(二十三)---ES数据建模与Mysql对比 一对多模型

    我们如何把Mysql的模型合理的在ES中去实现? 就需要你对要存储的数据足够的了解,及对应用场景足够的深入分析,才能建立一个合适的模型,便于你后期扩展 一对一 模型 一对多 模型 多对多 模型 1.一对多 模型 我们现在有两个模型, 一个商品Product, 一个分类Category , 我们对比下一

    2024年02月08日
    浏览(47)
  • Elasticsearch实战(二十二)---ES数据建模与Mysql对比 一对一模型

    我们如何把Mysql的模型合理的在ES中去实现? 就需要你对要存储的数据足够的了解,及对应用场景足够的深入分析,才能建立一个合适的模型,便于你后期扩展 实体之间的关系: 一对一 模型 一对一(1:1):一个实体最多只能能另一个实体相关联,另一个实体如是。 例:一个只能

    2024年02月10日
    浏览(47)
  • [golang gin框架] 38.Gin操作Elasticsearch创建索引、修改映射、数据CURD以及数据分页

    常见的 Golang 操作 ElasticSearch 的插件主要有下面两个: 第三方插件: github.com/olivere/elastic 官网插件 github.com/elastic/go-elasticsearch 其中 elastic 比 go-elasticsearch 文档更全面一些,start 量也更多一些,本节讲解 elastic 使用第三方库 https://github.com/olivere/elastic 来连接 ES 并进行操作 注意

    2024年02月09日
    浏览(48)
  • Mybatis-plus 两种分页方法(分单表和联表)

    准备1:引入PageHelper依赖 准备2:新建表格分页数据对象 准备3:分页数据类 准备4:分页工具类 准备5:响应请求分页数据的方法 正式使用 1、如果只是单表查询,可以用QueryWrapper controller层 在service层新增接口以及实现类的方法 2、或者自定义SQL要多表查询,可以自己写方法联

    2024年02月05日
    浏览(33)
  • ElasticSearch(ES)深度分页详解

    ElasticSearch 是一个实时的分布式搜索与分析引擎,常用于大量非结构化数据的存储和快速检索场景,具有很强的扩展性。纵使其有诸多优点,在搜索领域远超关系型数据库,但依然存在与关系型数据库同样的深度分页问题,本文就此问题做一个实践性分析探讨 from + size 分页方

    2024年01月23日
    浏览(34)
  • ES多种分页方案以及深分页处理

    ElasticSearch 是一个实时的分布式搜索与分析引擎,常用于大量非结构化数据的存储和快速检索场景,具有很强的扩展性。纵使其有诸多优点,在搜索领域远超关系型数据库,但依然存在与关系型数据库同样的深度分页问题,本文将介绍ES的多种分页方式以及深分页的处理。 f

    2024年04月17日
    浏览(29)
  • ES(Elasticsearch)+SpringBoot实现分页查询

    1.ES介绍   ES作为一个搜索工具,寄托于Lucene之上,提供了方便的数据存储和搜索服务,一般的用它来作为网页数据索引以及存储用户画像(即用户标签)数据,可以提供复具有复杂的查询条件的服务。例如在网页索引中,通过倒排的方式索引的方式,对文档进行分词存储,

    2024年02月16日
    浏览(37)
  • Mybatis Plus中使用LambdaQueryWrapper进行分页以及模糊查询对比传统XML方式进行分页

    传统的XML方式只能使用limit以及offset进行分页,通过判断name和bindState是否为空,不为空则拼接条件。 只需要在Service实现类中直接调用Mybatis Plus的方法即可进行操作。 return PageSanitationCompanyStaff类型可以得到数据的总数,你也可以通过.getRecords()方式获取List集合 这样子,我们就

    2024年02月12日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包