You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Elasticsearch MultiSearch API分页疑问:能否用Scroll?哪种方式最优?

Elasticsearch MultiSearch API 分页问题解答

能不能在MultiSearch的每个查询中使用Scroll分页?

不行哦。Scroll API是针对单个搜索请求创建并维护搜索上下文的,它需要返回专属的scroll_id来后续获取下一页数据。而MultiSearch API的设计是批量执行多个独立的搜索请求,每个子查询都是一次性的,Elasticsearch不会为每个子查询单独创建Scroll上下文,也没法返回多个对应的scroll_id。官方明确不支持在MultiSearch的子查询中添加scroll参数,就算加了也不会生效。

只能使用from/size吗?

是的,在MultiSearch的子查询里,分页只能用from/size参数。不过要注意from/size的局限性:当from值很大(比如超过10000)时,会触发Elasticsearch的index.max_result_window限制(默认是10000),而且深分页的性能会很差——因为Elasticsearch需要先加载前面所有的数据再截断。

MultiSearch API分页的最佳方式

分两种场景来选择最合适的方案:

场景1:每个子查询的结果集较小(无深分页需求)

直接用from/size就足够了,简单易实现。比如给你的查询加上分页参数:

{"index" : "my-index-01", "type": "my-type-01"} 
{"query":{"multi_match":{"query":"house","fields":["name", "title"]}}, "from": 0, "size": 10}
{"index" : "my-index-02", "type": "my-type-02"} 
{"query":{"multi_match":{"query":"c","fields":["name","title"]}}, "from": 0, "size": 10}
{"index" : "my-index-03", "type": "my-type-03"} 
{"query":{"multi_match":{"query":"c","fields":["name"]}}, "from": 0, "size": 10}

如果需要下一页,就把每个子查询的from值改成10、20以此类推即可。

场景2:某个/某些子查询需要处理大量数据(深分页或全量导出)

这种情况下,不要把这些查询放在MultiSearch里,而是单独对对应的索引发起Scroll请求。你可以并行处理多个独立的Scroll请求,这样既满足了批量获取大量数据的需求,效率也不会比MultiSearch低。

举个例子,单独对my-index-01发起Scroll请求:

// 初始请求
POST /my-index-01/_search?scroll=1m
{
  "query": {"multi_match":{"query":"house","fields":["name", "title"]}},
  "size": 100
}

// 后续分页请求
POST /_search/scroll
{
  "scroll": "1m",
  "scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAA..."
}

内容的提问来源于stack exchange,提问作者javaTry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:28:51