增大max_result_window是错的,ES只能查询前10000条数据的正确解决方案

简介: 增大max_result_window是错的,ES只能查询前10000条数据的正确解决方案

1、问题现象描述

Result window is too large, from + size must be less than or equal to [10000] but was [xxxxx].


2、错误的解决方案

2.1 使用max_result_window的错误解决方案

网上你能搜到的大部分解决方法都是让你把max_result_window参数阈值调大。

具体执行代码为(注意:以下为错误解决方案,正解在文末):


  • 基于特定索引生效:
PUT <index_name>/_settings
{
  "index.max_result_window": <number>
}


  • 基于全局生效配置:
PUT _all/_settings
{
  "index.max_result_window": <number>
}


2.2 官方对max_result_window参数的解释

没错,这的确能解决眼前问题,但是会带来严重的后果,最常见的就是后期频繁的 OOM,而且很难发现原因。

看一下官方对该参数的解释:

4c2a5d5d34f04dbeb9c54ed7e5f18020.png网上任何让你无脑增加参数值的做法都是非常不负责任的,相当于用dú品帮你治病,虽然眼前让你神清气爽,但是完全不顾及后果。


2.3 官方推荐的解决方案

官方文档https://www.elastic.co/guide/en/elasticsearch/reference/8.3/paginate-search-results.html#search-after

b56917c70abb4a46a46589d24da8c768.png


下面我来把这个问题的正确答案详细解释一下。


3、问题原理剖析

正常情况下ES的分页代码如实下面这样的:

GET order_2290w/_search
{
  "from": 0,
  "size": 5
}


输出结果如下图:

cafbc619a1784b7783d2841bfce1fc45.png


很好理解,即查询第一页的5条数据。图中数字2即返回的五条文档数据。但是如果我们查询的数据页数特别大,达到什么程度呢?当from + size大于10000的时候,就会出现问题,如下图报错信息所示:

974a8ae51d6944b9b39d4b5064a27ad6.png

报错信息的解释为当前查询的结果超过了10000的最大值。那么疑问就来了,明明只查询了5条数据,为什么它计算最大值要加上我from的数量呢?而且Elasticsearch不是号称PB及数据秒级查询,几十亿的数据都没问题,怎么还限制最大查询前10000条数据呢?这里有一个字很关键:“前”,前10000条意味着什么?意味着数据肯定是按照某种顺序排列的,ES中如果不人工指定排序字段,那么最终结果将按照相关度评分排序。


4、关于max_result_window参数的正确理解

4.1 max_result_window参数的具体含义

max_result_window是分页返回的最大数值,默认值为10000。max_result_window本身是对JVM的一种保护机制,通过设定一个合理的阈值,避免初学者分页查询时由于单页数据过大而导致OOM。


在很多业务场景中经常需要查询10000条以后的数据,当遇到不能查询10000条以后的数据的问题之后,网上的很多答案会告诉你可以通过放开这个参数的限制,将其配置为100万,甚至1000万就行。


但是如果仅仅放开这个参数就行,那么这个参数限制的意义有何在呢?如果你不知道这个参数的意义,很可能导致的后果就是频繁的发生OOM而且很难找到原因


4.2 如果正确设置max_result_window参数

那么这个参数就完全不能动吗?当然不是,设置一个合理的参数阈值是需要通过你的各项指标参数来衡量确定的,比如你用户量、数据量、物理内存的大小、分片的数量等等。通过监控数据和分析各项指标从而确定一个最佳值,并非越大越好。


建议如果你不是对 ES 有足够的了解和使用经验,不要轻易修改max_result_window参数的阈值!


5、底层原理详解及正确的解决方案

正确的解决方法:使用 Search after

关于max_result_window的深层次原理,及 Search after 的使用方法

相关文章
|
3月前
|
监控 Serverless Shell
函数计算操作报错合集之 显示"Function timed out after 30 seconds (maxMemoryUsage: 73.38MB)" ,该如何解决
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
|
4月前
|
索引
filebeat 设置索引的 max_result_window
在 Filebeat 中设置索引的 max_result_window 需要修改 Elasticsearch 的索引模板。max_result_window 参数定义了在 Elasticsearch 中执行搜索时,最大返回文档的数量。默认情况下,该值为 10000。 要修改该值,可以按照以下步骤操作: 打开 Filebeat 的配置文件。 找到输出部分,其中定义了 Elasticsearch 输出。 在 Elasticsearch 输出配置中,找到索引模板相关的配置。 确保你已经定义了自定义的索引模板(如果没有,请创建一个)。 在索引模板中,设置 max_result_window 参数为
|
存储 分布式计算 搜索推荐
ES自定义评分机制:function_score查询详解
ES自定义评分机制:function_score查询详解
1255 0
ES自定义评分机制:function_score查询详解
|
SQL Oracle 关系型数据库
【SQL开发实战技巧】系列(十五):查找最值所在行数据信息及快速计算总和百之max/min() keep() over()、fisrt_value、last_value、ratio_to_report
本篇文章讲解的主要内容是:***计算部门中那个工资等级的员工最多、通过返回部门10最大工资所在行的员工名称小案例来讲解max/min() keep() over()、通过查询工资最高的人小案例来介绍fisrt_value、last_value、通过计算各个部门的工资合计以及各个部门合计工资占总工资的比例小案例来介绍如何计算百分比及ratio_to_report分析函数的使用***
【SQL开发实战技巧】系列(十五):查找最值所在行数据信息及快速计算总和百之max/min() keep() over()、fisrt_value、last_value、ratio_to_report
|
索引
Ts中string、number和any等类型 不能当做索引用,怎么处理?
Ts中string、number和any等类型 不能当做索引用,怎么处理?
345 0
ts重点学习49-函数得参数得处理方式
ts重点学习49-函数得参数得处理方式
80 0
ts重点学习49-函数得参数得处理方式
|
索引
ts重点学习87-索引类型
ts重点学习87-索引类型
76 0
ts重点学习87-索引类型
ts重点学习89-条件类型
ts重点学习89-条件类型
65 0
ts重点学习89-条件类型
|
索引
ts重点学习39-索引签名
ts重点学习39-索引签名
60 0
ts重点学习39-索引签名
ts重点学习91-分布式条件类型
ts重点学习91-分布式条件类型
89 0
ts重点学习91-分布式条件类型