Elasticsearch默认返回10条记录,无Scroll API如何获取全部数据?
如何在不使用Scroll API的情况下单次获取Elasticsearch所有记录
首先得明确Elasticsearch的一个核心性能限制:它默认有个max_result_window参数,默认值是10000。这是ES为了避免单次查询返回过多数据导致内存过载而设置的阈值——也就是说,不管你把size参数设得多大,单次查询最多只能返回10000条结果,除非你修改这个参数(但不推荐随意调大,会显著影响集群性能)。
基于这个前提,分两种场景处理:
如果你的数据总量≤10000条:
直接在查询里把size设为一个足够大的数值(比如10000),就能一次性拿到所有记录。就算你预先不知道总条数也没关系,ES会自动返回实际存在的所有数据,不会返回空结果填充。示例DSL如下:GET /your_index_name/_search { "size": 10000, "query": { "match_all": {} } }如果你的数据总量>10000条:
这种情况下单次查询无法获取所有记录(强制修改max_result_window的话,会让ES在计算排序、聚合和返回结果时消耗大量内存,甚至引发OOM,风险极高)。如果不能用Scroll API,更推荐用search_afterAPI(它是Scroll的轻量替代方案,基于上一页的最后一条记录的排序值来分页),但这已经不属于单次查询的范畴了。
另外补充个小技巧:如果想先确认数据总条数再设置size,可以先执行一次极简查询,从返回结果的hits.total.value字段里拿到总条数,再决定size的取值——这需要两次查询,但对数据量不大的场景来说很实用。
内容的提问来源于stack exchange,提问作者Ajinkya Dhote
相关产品推荐
相关产品推荐

