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

这篇具有很好参考价值的文章主要介绍了Result window is too large, from + size must be less than or equal to: [10000] but was。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

场景

做分页查询,当分页达到一定量的时候,报如下错误:

Resultwindowis too large, from+ size must be less than or equal to: [10000] but was [78020]. See the scroll api for a more efficient way to request large data sets. This limit can be setby changing the [index.max_result_window] index level setting.

原因分析: es对from + size的大小进行限制,必须小于等于10000。

解决方案:

方案一(有风险)

将max_result_window参数阈值调大,在业务中限制分页大小,使from+size<=10000;

具体操作

改法一:

动态更改索引设置,为max_result_window参数赋值足够大的值,此处改法有两种,具体如下:

基于特定索引生效:

PUT <index_name>/_settings
{
  "index.max_result_window": <number>
} 

基于全局生效配置:

PUT _all/_settings
{
  "index.max_result_window": <number>
}
改法二:

修改配置文件elasticsearch.yml,增加下列配置,并重启elasticsearch。

index.max_result_window: 100000000

其中改法一只当前有效,elasticsearch重启失效,改法二重启后生效。

PS:这种改法的确能解决眼前问题(网上教程普遍做法),但是会带来严重的后果,得结合业务去考虑,如果你的业务索引库存储数据量大,即单个文档字段多,那么随意改动最大结果窗口配置最常见的就是后期会有OOM现象,而且很难发现原因。

问题分析

Result window is too large, from + size must be less than or equal to: [10000] but was,elasticsearch,java,Powered by 金山文档

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

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

返回结果

Result window is too large, from + size must be less than or equal to: [10000] but was,elasticsearch,java,Powered by 金山文档

看查询结果我们可以得知,这是一个查询结果集前5条数据的一个检索,即查询第一页的5条数据。返回结果图中数字2即返回的五条文档数据。

如何触发我们标题中的错误,自然是要查询足够大分页的数据啦,达到什么程度呢?当from + size大于10000的时候,就会出现问题,如下图报错信息所示:

Result window is too large, from + size must be less than or equal to: [10000] but was,elasticsearch,java,Powered by 金山文档

报错信息的解释为当前查询的结果超过了10000的最大值。那么疑问就来了,明明只查询了5条数据,为什么它计算最大值要加上我from的数量呢?这里有一个字很关键:“前”,前10000条意味着什么?

ES的from+size查询机制

假设我们的ES有三个节点,当分页查询请求过来时,如果落到node1节点,那么node1节点将会向node2和node3发送同样的查询请求,每个节点将topN的文档返回(这里只返回文档的id以及打分排序的字段,减少数据传输),node1会对三个节点的所有文档(3N个)进行排序,取topN后再根据文档的id到对应的节点上查询整个文档数据,最后返回客户端。

而对于分页查询,比如from=10000,szie=10000,其实每个节点需要查询from+size=20000条数据,排序之后截取后10000条数据。当我们进行深度分页,比如查询第十页数据时,每个节点需要查询10size=10W条数据,这个太恐怖了。而且默认情况下,当from+size大于10000时,查询会抛出一个异常,ES2.0后有一个max_result_window属性的设置,默认值是10000,也就是from+size的最大限度。当然你可以修改这个值作为临时的应对策略,不过治标不治本,产品也只会变本加厉!

max_result_window参数的具体含义

max_result_window是分页返回的最大数值,默认值为10000。max_result_window本身是对JVM的一种保护机制,通过设定一个合理的阈值,避免初学者分页查询时由于单页数据过大而导致OOM。在很多业务场景中经常需要查询10000条以后的数据,当遇到不能查询10000条以后的数据的问题之后,网上的很多答案会告诉你可以通过放开这个参数的限制,将其配置为100万,甚至1000万就行。但是如果仅仅放开这个参数就行,那么这个参数限制的意义有何在呢?如果你不知道这个参数的意义,很可能导致的后果就是频繁的发生OOM而且很难找到原因,设置一个合理的大小是需要通过你的各项指标参数来衡量确定的,比如你用户量、数据量、物理内存的大小、分片的数量等等。通过监控数据和分析各项指标从而确定一个最佳值,并非越大约好。

方案二:官方推荐的解决方案 search_after查询

search_after是ES5.0及之后版本提供的新特性,search_after有点类似scroll,但是和scroll又不一样,它提供一个活动的游标,通过上一次查询最后一条数据来进行下一次查询。

比如第一次查询如下:

GET zm/recall/_search
{
    {
        "query": {
            "match_all": {}
        },
        "sort": [
            {
                "lastModifyTime": {
                    "order": "desc"
                }
            }
        ],
        "size": 10
    }
}

这里根据更新时间进行排序,拿到的结果如下:

{"_index":"zmrecall","_type":"recall","_id":"60310505115909","_score":null,"_source":{"userId":60310505115909,"score":1,"city":[276],"sex":1,"age":29,"lastModifyTime":1545037514},"sort":[1545037514]}

注意到返回结果中有一个sort字段,所以下一次查询的时候,只需要将本次查询最后一条数据中的排序字段加入查询即可:

GET zm/recall/_search
{
    {
        "query": {
            "match_all": {}
        },
        "sort": [
            {
                "lastModifyTime": {
                    "order": "desc"
                }
            }
        ],
        "search_after": [
            1545037514
        ], //这个值与上次查询最后一条数据的sort值一致,支持多个
        "size": 10
    }
}

如何使用 search after 解决大型搜索引擎场景下深度分页问题

不支持向前搜索,只能向后执行

每次只能向后搜索1页数据

以百度为例,默认加载10页数据,假设每页数据为 10条,其实对于ES而言,还不涉及深度分页问题,因为只是查询了一百条数据。

如果项目并发请求并不高,可以单次查询 100 条数据。或者采用懒加载的方式异步请求前十页数据。后面的数据采用 search after 向后翻页即可。

方案三:scroll查询

ES支持scroll滚屏查询,有兴趣的同学可以了解一下,网上相关的文档不少。不过根据ES官网的描述,scroll查询是很耗性能的方式,不建议在实时查询中运用。官方已不推荐使用滚动查询进行深度分页查询,因为无法保存索引状态。

适合场景

单个滚动搜索请求中检索大量结果。

为了使用滚动,初始搜索请求应该scroll在查询字符串中指定参数,该 参数告诉 Elasticsearch 应该保持“搜索上下文”多长时间,例如?scroll=1m。结果如下:


{
  "_scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAABVWsWN3Q4dDJjcVVRQ0NBbllGMmFqN0ZVZw==",  
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 21921750,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      ...
    ]
  }
}
BASH 复制 全屏

上述请求的结果包含一个_scroll_id,应将其传递给scrollAPI 以检索下一批结果。

滚动返回在初始搜索请求时与搜索匹配的所有文档。它会忽略对这些文档的任何后续更改。该scroll_id标识一个搜索上下文它记录身边的一切Elasticsearch需要返回正确的文件。搜索上下文由初始请求创建,并由后续请求保持活动状态文章来源地址https://www.toymoban.com/news/detail-590550.html

GET <index>/_search?scroll=1m
{
  "size": 100
}

到了这里,关于Result window is too large, from + size must be less than or equal to: [10000] but was的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535.

    Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535.

    新建表或者修改表varchar字段长度的时候,出现这个错误 大概意思就是行大小太大,不能超过65535 长度改为21842就正常了,这是为什么? 最终我们执行正确的SQL语句 这里的21842长度是怎么来的? 首先它是什么意思?表示21842字符 首先来了解几个规则,对我们的字符数有影响的

    2024年02月05日
    浏览(3)
  • MySQL报错:ERROR 1118 (42000): Row size too large. 或者 Row size too large (> 8126).

    MySQL报错:ERROR 1118 (42000): Row size too large. 或者 Row size too large (> 8126).

    今天拿到一个建语句时,大概二百多个字段,然后大部分类型是 string 的,要求建 MySQL 的表。首先将 string 替换为 varchar(xx),然后执行了一下语句,报错如下所示: ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhe

    2023年04月09日
    浏览(7)
  • MySQL:1118 - Row size too large(行大小不能超过 65535 问题)

    当我们创建表或新增字段时,我们可能遇到下面这个问题: 大概的意思是说:行的大小过大,最大限制为 65535 ,其中不包括 TEXT or BLOB 类型,建议调整一些列为 TEXT or BLOB 类型。 下面我们来具体分析一下这个问题,并探讨如何解决。 MySQL 行大小最大限制为65535,不包括TEXT、

    2024年01月21日
    浏览(8)
  • kafka消费/发送消息,消息过大报错解决whose size is larger than the fetch size 1048576

    kafka消费/发送消息,消息过大报错解决whose size is larger than the fetch size 1048576

    一、kafka消费报错原因 问题原因一:个是kafka本身的配置没有调整到上限 问题原因二:就是我们自己写python消费kafka代码的时候没有参数配置没有限制 RecordTooLargeError: (\\\"There are some messages at [Partition=Offset]: {TopicPartition(topic=\\\'psadad\\\', partition=1): 75} whose size is larger than the fetch size 1

    2024年02月07日
    浏览(7)
  • 成功解决使用BCEWithLogitsLoss时ValueError: Target size (torch.Size([4])) must be the same as input size (to

    成功解决使用BCEWithLogitsLoss时ValueError: Target size (torch.Size([4])) must be the same as input size (torch.Size([4, 1])) 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得到您的订阅和支持~ 💡 创作高质量

    2024年03月11日
    浏览(30)
  • 【报错处理】RuntimeError: input.size(-1) must be equal to input_size. Expected 5, got 21

    1、 原因 : 使用view时维度指定错误,LSTM(input,(h0,c0)) 指定batch_first=True​后,input就是(batch_size,seq_len,input_size)否则为input(seq_len, batch, input_size) 2、原因:并不是rnn的错误,而是因为下一函数的输入和这一层输出维度不一样,对照维度信息和尺寸信息修改即可。 推荐报错解决方

    2024年02月16日
    浏览(8)
  • MySQL排查问题row size too large (> 8126). Changing some columns to TEXT or BLOB may help.

    MySQL排查问题row size too large (> 8126). Changing some columns to TEXT or BLOB may help.

    例子:给表增加一列报错: 1118: Row size too large ( 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. 单行记录的合计最大大小超过了 8126 字节,那么根据文档描述的话,使用dynamic行格式的表行最大大小可以达到65536字节(因为mysql内部使用了

    2024年02月13日
    浏览(31)
  • Leetcode 3007. Maximum Number That Sum of the Prices Is Less Than or Equal to K

    Leetcode 3007. Maximum Number That Sum of the Prices Is Less Than or Equal to K 1. 解题思路 2. 代码实现 题目链接:3007. Maximum Number That Sum of the Prices Is Less Than or Equal to K 这一题我的思路上就是一个二分的思路,先确定一个上下界,然后不断通过二分来找到最大的price不超过k的值。 因此,剩下的

    2024年01月20日
    浏览(7)
  • 解决Apache Tomcat “Request header is too large“ 异常 ‍

    解决Apache Tomcat “Request header is too large“ 异常 ‍

    🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页 ——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》 🐾 学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通Golang(基础

    2024年02月09日
    浏览(9)
  • 1118 - Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMI

    1118 - Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMI

    🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通Golang(基础入门篇)》学会Golang语言

    2024年02月10日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包