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
相关产品推荐
相关产品推荐

