增大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 的使用方法

相关文章
|
监控 Java 索引
ES 生产中10个常见参数阈值(默认最大值)操作及优化解决方案
ES 生产中10个常见参数阈值(默认最大值)操作及优化解决方案
ES 生产中10个常见参数阈值(默认最大值)操作及优化解决方案
|
存储 JSON 网络协议
ElasticsearchRestTemplate客户端使用
ElasticsearchRestTemplate客户端使用
ElasticSearch Task命令说明
ElasticSearch task相关命令,以及返回信息解读。
6312 0
ElasticSearch Task命令说明
|
缓存 监控 Java
【Elasticsearch专栏 09】深入探索:Elasticsearch如何处理并发写入和读取请求
Elasticsearch通过分片机制分散读写请求,利用事务日志确保数据持久性,通过多线程处理并发请求,并允许通过配置调整分片和副本数量、线程池设置来优化并发性能。同时,使用批量操作和查询优化进一步提高写入和读取效率。
555 0
|
存储 Java 索引
Elastic实战:彻底解决spring-data-elasticsearch日期、时间类型数据读取报错问题
在使用spring-data-elasticsearch读取es中时间类型的数据时出现了日期转换报错,不少初学者会在这里困惑很久,所以今天我们专门来解读该问题的几种解决方案。
3005 0
Elastic实战:彻底解决spring-data-elasticsearch日期、时间类型数据读取报错问题
|
存储 缓存 自然语言处理
Elasticsearch 查询性能优化:从 3 秒到 300ms 的 6 个核心参数调优指南
本文分享某电商平台 Elasticsearch 性能调优实战,通过调整分片数、刷新间隔、缓存配置等 6 个核心参数,将商品搜索从 3 秒优化至 300 毫秒,显著提升查询性能与系统吞吐量。内容涵盖性能诊断、参数调优逻辑、实操方案及避坑指南,助力高频查询场景下的 ES 优化。
elasticsearch使用 scroll 滚动分页实战实例
elasticsearch使用 scroll 滚动分页实战实例
518 0
|
存储 缓存 监控
极致 ElasticSearch 调优,让你的ES 狂飙100倍!
尼恩分享了一篇关于提升Elasticsearch集群的整体性能和稳定性措施的文章。他从硬件、系统、JVM、集群、索引和查询等多个层面对ES的性能优化进行分析,帮助读者提升技术水平。
|
SQL JSON 数据格式
ES中如何实现空值和非空值的查询
ES中如何实现空值和非空值的查询
5881 0
|
存储 Java
elasticsearch 如果按照日期进行筛选
如果你需要按照日期进行筛选,你可以使用 Elasticsearch 的范围查询来实现。以下是一个示例代码,演示如何在 Java 中进行日期范围查询: ```java import org.apache.http.HttpHost; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.Req
752 7