索引:共4T,5个索引,共100亿条数据

查询语句:

{
   "query":{
       "term":{
           "app_servername":"set-app-heatontime01"
       }
   },
   "size":10000,
   "sort": [
       {"es_timestamp": "asc"},
   ]
}

符合条件结果总共5亿条数据。

scroll测试

拉取结果耗时:

拉取条数

10万

20万

50万

100万

200万

300万

500万

耗时

13.5s

30s

76s

158s

313s

560s

787s

es的并发scroll不适合深度翻页,只适合拉取所有数据。

es search_after也不适合做深度分页,分页多了,内存不够,将查询失败。

我们在分页的时候如果用from+size的话,from + size 默认不能超过1万条数据。

使用from + size方式是将请求达到分片节点上,如果有n个副分片,则查询数据是 n * (from+size) 如果from很大的话,会造成oom或者网络资源的浪费。

若使用scroll的话,尽管能读取许多数据,但是查询出来的结果都是无序的。

对于深度分页,到底有没有比较理想的解决方案,既能拉取比较多的数据,拉取的数据也都是有序的?那么你可以了解下search_after。

第一步

代码块

GET twitter/tweet/_search
{
    "size": 10,
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    },
    "sort": [
        {"es_timestamp": "asc"},
        {"_uid": "desc"}
    ]
}

和我们正常查询没有什么区别,这里必须要使用sort进行排序。

同时sort中必须至少包含一个唯一的字段来进行排序,推荐使用_uid(必须有)。

同时日志中心的数据,也尽量将es_timestamp加上去一起排序。

若这里没有唯一的字段,那么每次获取结果将不够精确,影响使用。

返回的response如下:

代码块

  {
            "_index": "log.xxx.20181120_2",
            "_type": "logs",
            "_id": "AWcvRPOwqf9vJFGaVemX",
            "_score": null,
            "_source": {
               "mt_level": "WARN",
               "traceId__": "5919513527137007410",
               "mt_appkey": "xxxx",
               "mt_thread": "xxxx0",
               "es_timestamp": "2018/11/20 11:58:23 +0800",
               "mt_logger_name": "xxxx",
               "mt_datetime": "2018-11-20 11:58:23+0800",
               "message": " select scope cost:0\n",
               "mt_servername": "xxxxx"
            },
            "sort": [
               1542686303000,
               "logs#AWcvRPOwqf9vJFGaVemX"
            ]
         }

注意这里返回的sort结构。返回了每条数据的es_timestamp和_uid。

第二次分页

代码块

GET twitter/tweet/_search
{
    "size": 10,
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    },
    "search_after": [1463538857, "tweet#654323"],
    "sort": [
        {"es_timestamp": "asc"},
        {"_uid": "desc"}
    ]
}

若我们想接着上次读取的结果进行读取下一页数据,第二次查询在第一次查询时的语句基础上添加search_after,并指明从哪个数据后开始读取。

search_after原理比较简单:

因为我们在sort中指明了唯一字段_uid,所以查询的数据整体肯定是有序的,在第二次查询时,同时将search_after指定的值作为查询条件(类似游标),指定从整个有序数据哪个位置继续查询。

缺陷:

search_after并不能代替from+ size和scroll,它每第二次读取时,必须要指定查询地址(游标search_after),实际使用时,只能一页一页的向下翻,而不能跳页查询。

ES的深度分页解决方案相关推荐

  1. Java架构直通车——ElasticSearch深度分页解决方案

    文章目录 分页查询 深度分页 深度分页解决方案 分页查询 分页查询是这样的: POST /shop/_doc/_search {"query": {"match_all& ...

  2. 京东面试题:ElasticSearch深度分页解决方案

    前言 Elasticsearch 是一个实时的分布式搜索与分析引擎,在使用过程中,有一些典型的使用场景,比如分页.遍历等. 在使用关系型数据库中,我们被告知要注意甚至被明确禁止使用深度分页,同理,在 ...

  3. es查询-统计总数以及深度分页

    一.查询总数 1.  ES 查询 hits 统计总数不准? 当我们使用 ES 的时候,有时会比较关心匹配到的文档总数是多少,所以在查询得到结果后会使用 hits.total.value 这个值作为匹配 ...

  4. 上亿数据怎么玩深度分页?兼容MySQL + ES + MongoDB

    面试题 & 真实经历 面试题:在数据量很大的情况下,怎么实现深度分页? 大家在面试时,或者准备面试中可能会遇到上述的问题,大多的回答基本上是分库分表建索引,这是一种很标准的正确回答,但现实总是 ...

  5. ES深度分页查询详解

    一.ES支持的三种分页查询方式 From + Size 查询 Scroll 遍历查询 Search After 查询 说明: 官方已经不再推荐采用Scroll API进行深度分页.如果遇到超过1000 ...

  6. SpringBoot 集成ES集群CRUD及分页解决方案

    1 SpringBoot 集成ES集群 1.2 pom <parent><groupId>org.springframework.boot</groupId>< ...

  7. ElasticSearch之处理深度分页

    ElasticSearch之处理深度分页 一.常规分页 二.scroll分页 三.search_after 在ES中实现分页的方法有三种,我们逐个分析一下他们的优缺点. 一.常规分页 在ES中,我们可 ...

  8. Elasticsearch分页解决方案研究

    目录 一.命令方式做分页 1.1 常见的分页方式:from+size 1.2 scroll方式 1.3 search_after 的方式 二.java api做elasticsearch分页 2.1  ...

  9. 如何在elasticsearch里面使用深度分页功能

    2019独角兽企业重金招聘Python工程师标准>>> 前面的文章提到过es默认的from+size的分页方式返回的结果数据集不能超过1万点,超过之后返回的数据越多性能就越低. 这是 ...

最新文章

  1. 设置JFrame背景图片
  2. 【赠书福利】不扶好眼镜,请别打开这本挑战JS语言特性的书
  3. CPtrArray、CObArray类
  4. JQuery使用笔记
  5. java基础—IO流——将一些字符写入到指定硬盘上的目录中去:
  6. c++ new delete
  7. wamp配置中的大小写
  8. 架构运维篇(二):Centos7/Linux安装部署Tomcat环境
  9. vs2005中文版/2010中文旗舰版等安装步骤和注意
  10. Jmeter 使用详解、性能压测分析与性能优化思路
  11. 植物大战僵尸外挂源码【C语言制作】
  12. html绘制小球并跟随鼠标移动,利用JS如何实现小球跟随鼠标移动
  13. CSU——1043克里莫
  14. GAMIT重新编译及升级
  15. linux关机了硬盘灯仍然亮着,win10关机硬盘灯还一直亮的原因和解决方法
  16. [转]Linux学习路线
  17. torch.eye()
  18. Linux 查看进程启动时间、运行时间
  19. ++couut 与 count++ 以及 --couut 与 count-- 区别
  20. 美国西北大学 计算机工程专业排名,美国西北大学计算机工程研究生最新专业排名...

热门文章

  1. 如何完全安装mysql数据库_数据库经验:如何简单安装MySQL数据库
  2. 34.在排序数组中查找元素的起始和末尾位置
  3. c语言单链表的字母排序,链表排序——选择排序法(纯C语言版)
  4. python环境问题踩坑
  5. windows 下mysql的安装于使用(启动、关闭)
  6. HDU 6185 Covering 矩阵快速幂 递推
  7. 《计算机科学导论》一1.1 图灵模型
  8. es6学习笔记2-—symbol、变量与作用域
  9. 开源中国git关联xcode操作步骤
  10. ThreadLocal使用