工作纪实38-ES分页数据问题

之前分页查询有接ES,随着系统使用时间数据量不断增加,会有如下报错。关键信息就是 Result window is too large, from + size must be less than or equal to: [10000] but was [100001]

当索引非常非常大(千万或亿),是无法按照from + size做深分页的,因为分页越深则越容易OOM,即便不OOM,也是很消耗CPU和内存资源的。官方在后2.x版本中已增加限定 index.max_result_window:10000作为保护措施,即默认 from + size 不能超过1万。(from表示从第几行开始,size表示查询多少条数据,from默认为0,size默认为10)

解决方案:

方案一、接口层面限制查询到10000条,业务端给提示让使用方继续筛选数据

java 复制代码
Integer queryTotal = pageQuery.getPageIndex() * pageQuery.getPageSize();
if (queryTotal > 10000) {
	throw new BusinessException(String.format("只能查询前[%s]条数据, 建议缩小查询范围", 10000));
}

方案二、使用其他的深分页策略:scroll 或者scroll after【缺点是不能随意上下翻页,根据场景选择】

方案三:创建索引时设置【不推荐】

yaml 复制代码
"settings":{
	"index":{
		"max_result_window":1000000
   } 
}
相关推荐
m0_588758481 分钟前
CSS如何创建三角箭头图标_通过border透明技巧实现
jvm·数据库·python
studyForMokey4 分钟前
【Android面试】Java专题 todo
android·java·面试
九皇叔叔6 分钟前
MySQL实操指南:复制表及数据复制全解析
android·数据库·mysql
一只大袋鼠9 分钟前
MyBatis 特性(三):缓存、延迟加载、注解开发
java·数据库·笔记·sql·缓存·mybatis
m0_3776182314 分钟前
如何解决预检查网络失败_runcluvfy阶段报错忽略与修复
jvm·数据库·python
m0_5150984217 分钟前
如何配置Oracle分布式事务_两阶段提交与DB_DOMAIN参数
jvm·数据库·python
m0_6845019818 分钟前
SQL嵌套查询在ETL流程的应用_数据清洗逻辑
jvm·数据库·python
djjdjdjdjjdj19 分钟前
c++ circle元编程如何使用
jvm·数据库·python
老毛肚21 分钟前
Redis高级
java·数据库·redis
2401_8716965221 分钟前
如何解决Data Guard主库ORA-16038日志无法归档_强制日志传输报错排查
jvm·数据库·python