【ElasticSearch】(五)“Result window is too large 深度分页”的利弊权衡

2024-08-26 20:58

本文主要是介绍【ElasticSearch】(五)“Result window is too large 深度分页”的利弊权衡,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    如题,在使用elastic search的dsl查询过程中,遇到了如下问题:

{"error": {"root_cause": [{"type": "query_phase_execution_exception","reason": "Result window is too large, from + size must be less than or equal to: [200] but was [1000]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level parameter."}],"type": "search_phase_execution_exception","reason": "all shards failed","phase": "query","grouped": true,"failed_shards": [{"shard": 0,"index": "fcar_city","node": "7EtAlFI7QEOpQD3rHvTm0g","reason": {"type": "query_phase_execution_exception","reason": "Result window is too large, from + size must be less than or equal to: [200] but was [1000]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level parameter."}}]},"status": 500
}

     比较不解,我的dsl语句是这样:

{"query": {"bool": {"must": [{"match_all": {}
}
]
}
},"from": 0,"size": 1000

}

     仅仅是对“fcar_city”这一个索引,做了“match_all”查询,结果:result windows is too large.很不解。网上搜索,大致的解决方案,是通过修改“max_result_window”,比预设的size值大即可,比如:

PUT fcar_city/_settings
{"index":{"max_result_window":1000000}
}

     我对fcar_city索引重设max_result_window属性,之后dsl查询成功。

      

     过程中在stackoverflow上看到一个帖子,直接修改上述属性会导致一些问题,比如 high memory consumption,这里牵扯到一个概念“deep paging”(深度分页),es官方对其介绍:

     https://www.elastic.co/guide/en/elasticsearch/guide/current/pagination.html

     https://www.elastic.co/guide/en/elasticsearch/guide/current/_fetch_phase.html

    介绍分页:

    1.es要实现mysql中limit的效果,通过from size来做。

  size :指示应返回的结果数,默认为 10

  from  :指示应跳过的初始结果数,默认为 0

  举例,每页现实5条记录,分3页,分别获取第1~3页的内容:

GET / _search ?size = 5 
GET / _search ?size = 5 &from = 5 
GET / _search ?size = 5 &from = 10

       之所以说调大max_result_window会导致high memory consumption,从根上讲,搜索请求通常跨越多个分片,每个分片都会生成自己的排序结果,然后需要对其进行集中排序以确保整体顺序正确。

       如果分页太深或一次请求太多结果(max_result_window调大),假设我们在一个索引中搜索五个主分片,当我们请求结果的第一页(结果1到10)时,每个分片产生它自己的前10个结果并将它们返回到协调节点,然后协调节点对所有50个结果进行排序以选择整个前10个。现在想象我们要求第1,000页 - 即结果(10,001到10,010)。一切都以相同的方式工作,每个分片产生其前10,010个结果。然后,协调节点对所有50,050个结果进行排序,并丢弃其中的50,040个结果!可见,在分布式系统中,排序结果的成本随着页面越深而呈指数级增长。

 

      除此之外,在分布式中执行搜索,获取阶段的过程如下:

      

     

1.协调节点识别需要获取哪些文档GET并向相关分片发出多请求。
2.如果需要, 每个分片都会加载文档并丰富它们,然后将文档返回到协调节点。
3.获取所有文档后,协调节点将结果返回给客户端。

       协调节点首先决定实际需要获取哪些文档。例如,如果我们的查询指定{ "from": 90, "size": 10 },前90个结果将被丢弃,只需要检索接下来的10个结果。这些文档可能来自原始搜索请求中涉及的一个,部分或全部分片。     一旦协调节点收到所有结果,它就会将它们组装成一个返回给客户端的响应。  

        在fetch-phrase过程中,多个分片上会涉及到深度分页:

        query-then-fetch进程支持使用fromsize 参数进行分页,但是在限制范围内。 请记住,每个分片必须构建一个长度优先级队列from + size,所有这些队列都需要传递回协调节点。并且协调节点需要对 number_of_shards * (from + size)文档进行排序以便找到正确的 size文档。根据文档的大小,分片数量以及硬件,分页10,000到50,000个结果(1,000到5,000页)深度应该是完全可行的。但是,如果使用足够大的from值,则使用大量的CPU,内存和带宽,排序过程会变得非常沉重。

 

       所以说,解决“Result window is too large, from + size must be less than or equal to: [200] but was [1000]”这样的问题,偷懒的话,设置max_result_window满足业务需求,但是影响了集群的性能。如果想要避免deep paging导致的high memory consumption问题,请参考下一篇博客。关于scroll api.

 

 

 

这篇关于【ElasticSearch】(五)“Result window is too large 深度分页”的利弊权衡的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1109665

相关文章

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

深度解析Python yfinance的核心功能和高级用法

《深度解析Pythonyfinance的核心功能和高级用法》yfinance是一个功能强大且易于使用的Python库,用于从YahooFinance获取金融数据,本教程将深入探讨yfinance的核... 目录yfinance 深度解析教程 (python)1. 简介与安装1.1 什么是 yfinance?

Mybatis-Plus 3.5.12 分页拦截器消失的问题及快速解决方法

《Mybatis-Plus3.5.12分页拦截器消失的问题及快速解决方法》作为Java开发者,我们都爱用Mybatis-Plus简化CRUD操作,尤其是它的分页功能,几行代码就能搞定复杂的分页查询... 目录一、问题场景:分页拦截器突然 “失踪”二、问题根源:依赖拆分惹的祸三、解决办法:添加扩展依赖四、分页

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499