报错现象
日志中可查看到相关报错信息,含义:深度分页必须小于等于10000,而现在达到了20000。
代码语言:javascript复制Result window is too large, from size must be less than or equal to: [10000]
but was (20000]
报错分析
为了避免用户使用过大的分页请求导致集群 OOM,ES 具有默认的深分页限制,最大为10000。
特别说明:如果使用了腾讯云默认的索引模板创建索引,"max_result_window" 的限制为65536
解决方案
短期方案
调整集群的默认分页限制参数
调整单个索引,indexname 为索引名称
代码语言:javascript复制curl -XPUT http://x.x.x.x:9200/indexname/_settings -d '{"index": {"max_result_window": 65535}}'
调整集群所有索引
代码语言:javascript复制curl -XPUT http://x.x.x.x:9200/_all/_settings -d '{"index": {"max_result_window": 65535}}'
长期方案
临时调整参数的方式可解决无法查询超过10000条的问题,但会给集群带来较大的负担,影响性能,建议通过 scroll 来优化此类查询。
使用方式
代码语言:javascript复制curl -XGET http://x.x.x.x:9200/indexname/_search?scroll=1m //保持游标查询窗口的时间
{
"query": { "match_all": {}},
"sort" : ["_doc"], //关键字 _doc 是最有效的排序顺序。
"size": 1000
}
保持游标查询窗口的时间是指针对当前批处理的时间,而不是处理所有结果的时间。单个窗口的保持对于集群是有资源消耗的,因此这个时间不宜过长。更多设置方式,可参考 ES 原厂文档:https://www.elastic.co/guide/en/elasticsearch/reference/8.3/scroll-api.html