ES的深度分页解决方案
索引:共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的深度分页解决方案相关推荐
- Java架构直通车——ElasticSearch深度分页解决方案
文章目录 分页查询 深度分页 深度分页解决方案 分页查询 分页查询是这样的: POST /shop/_doc/_search {"query": {"match_all& ...
- 京东面试题:ElasticSearch深度分页解决方案
前言 Elasticsearch 是一个实时的分布式搜索与分析引擎,在使用过程中,有一些典型的使用场景,比如分页.遍历等. 在使用关系型数据库中,我们被告知要注意甚至被明确禁止使用深度分页,同理,在 ...
- es查询-统计总数以及深度分页
一.查询总数 1. ES 查询 hits 统计总数不准? 当我们使用 ES 的时候,有时会比较关心匹配到的文档总数是多少,所以在查询得到结果后会使用 hits.total.value 这个值作为匹配 ...
- 上亿数据怎么玩深度分页?兼容MySQL + ES + MongoDB
面试题 & 真实经历 面试题:在数据量很大的情况下,怎么实现深度分页? 大家在面试时,或者准备面试中可能会遇到上述的问题,大多的回答基本上是分库分表建索引,这是一种很标准的正确回答,但现实总是 ...
- ES深度分页查询详解
一.ES支持的三种分页查询方式 From + Size 查询 Scroll 遍历查询 Search After 查询 说明: 官方已经不再推荐采用Scroll API进行深度分页.如果遇到超过1000 ...
- SpringBoot 集成ES集群CRUD及分页解决方案
1 SpringBoot 集成ES集群 1.2 pom <parent><groupId>org.springframework.boot</groupId>< ...
- ElasticSearch之处理深度分页
ElasticSearch之处理深度分页 一.常规分页 二.scroll分页 三.search_after 在ES中实现分页的方法有三种,我们逐个分析一下他们的优缺点. 一.常规分页 在ES中,我们可 ...
- Elasticsearch分页解决方案研究
目录 一.命令方式做分页 1.1 常见的分页方式:from+size 1.2 scroll方式 1.3 search_after 的方式 二.java api做elasticsearch分页 2.1 ...
- 如何在elasticsearch里面使用深度分页功能
2019独角兽企业重金招聘Python工程师标准>>> 前面的文章提到过es默认的from+size的分页方式返回的结果数据集不能超过1万点,超过之后返回的数据越多性能就越低. 这是 ...
最新文章
- 设置JFrame背景图片
- 【赠书福利】不扶好眼镜,请别打开这本挑战JS语言特性的书
- CPtrArray、CObArray类
- JQuery使用笔记
- java基础—IO流——将一些字符写入到指定硬盘上的目录中去:
- c++ new delete
- wamp配置中的大小写
- 架构运维篇(二):Centos7/Linux安装部署Tomcat环境
- vs2005中文版/2010中文旗舰版等安装步骤和注意
- Jmeter 使用详解、性能压测分析与性能优化思路
- 植物大战僵尸外挂源码【C语言制作】
- html绘制小球并跟随鼠标移动,利用JS如何实现小球跟随鼠标移动
- CSU——1043克里莫
- GAMIT重新编译及升级
- linux关机了硬盘灯仍然亮着,win10关机硬盘灯还一直亮的原因和解决方法
- [转]Linux学习路线
- torch.eye()
- Linux 查看进程启动时间、运行时间
- ++couut 与 count++ 以及 --couut 与 count-- 区别
- 美国西北大学 计算机工程专业排名,美国西北大学计算机工程研究生最新专业排名...