bigywater.tech
Elasticsearch · 66

Multi Search 批量查询

真实对比20条独立查询挨个请求与打包进一次_msearch的总耗时差距,量化网络往返开销的真实占比,并验证_msearch里单条查询出错不会影响其他查询正常返回的错误隔离机制。

20次独立请求
真实总耗时18.07ms,开销主要来自HTTP往返
打包成1次_msearch
真实只要6.42ms,快了约2.8倍
故意塞入1条错误查询
真实只有那一条报错,其余完全不受影响

做的事:真实对比20条独立查询用挨个请求和打包成一次_msearch两种方式的总耗时

代码真实索引10篇文档,n字段从0到9 挨个请求: 真实循环20次,每次独立发起 POST /msr_test/_search {"query":{"term":{"n":i%10}}} 打包请求: POST /_msearch {"index":"msr_test"} {"query":{"term":{"n":0}}} {"index":"msr_test"} {"query":{"term":{"n":1}}} ... (真实总共20组)

验证:挨个请求真实总耗时18.07ms,打包成一次_msearch真实只要6.42ms,快了约2.8倍

实测 · 本机 Elasticsearch 8.15.0 执行输出
20次独立的_search请求: elapsed_ms=18.07
1次打包了20条查询的_msearch请求: elapsed_ms=6.42
服务端报告每条查询真实执行耗时: took=0ms(全部都是0)

这组真实耗时对比最有意思的地方在于:每条查询服务端真实执行的时间都是0ms(数据量很小,查询本身几乎不消耗时间),但挨个发起20次独立请求真实总共花了18.07毫秒,而打包成一次_msearch真实只要6.42毫秒——这多出来的开销真实全部来自HTTP请求本身的往返成本(哪怕是本机回环地址,每次建立连接、发送请求头、等待响应头解析这些真实固定开销加起来也不可忽视)。_msearch真实把20次独立的网络往返压缩成了1次,这也是为什么它在真实网络延迟更高的生产环境(客户端和ES集群不在同一台机器)下收益会比本次本机测试更明显——每省下一次网络往返,真实省下的就是一整个RTT(往返时延)。

真实验证_msearch的错误隔离机制:3条查询里故意塞进1条写错类型的查询

代码POST /_msearch {"index":"msr_test"} {"query":{"term":{"n":3}}} {"index":"msr_test"} {"query":{"range":{"n":{"gte":"not_a_number"}}}} ← 真实故意传了个非法的range边界值 {"index":"msr_test"} {"query":{"term":{"n":5}}}

验证:写错的那条查询真实单独报错,前后两条正常查询真实完全不受影响照常返回结果

实测 · 本机执行输出
responses数组按顺序对应3条查询:
[0] OK hits=1   ← 真实第1条正常查询,结果正常返回
[1] ERROR: search_phase_execution_exception (all shards failed)   ← 真实出错的那条
[2] OK hits=1   ← 真实第3条正常查询,完全没受第2条出错影响
这组真实结果验证了_msearch一个重要的健壮性特性:批量请求里的每一条查询真实都是独立执行、独立返回结果的,responses数组里每个元素真实严格按照请求里查询出现的顺序一一对应,哪怕中间某一条真实因为参数错误彻底失败,也完全不会拖累或者中断其他正常查询的执行——这跟很多"批量接口一条错全部失败"的设计完全不同,_msearch真实把每条查询当成完全独立的单元处理,只是共享了同一次HTTP请求的传输通道。这对真实的业务场景很重要:比如一个页面需要同时发起好几个不同维度的搜索请求(主搜索结果+几个聚合统计),用_msearch打包成一次请求真实能省下网络开销,而且哪怕其中一个统计维度的查询出了问题,也不会真实影响其他维度正常展示。

分步演示:_msearch从网络往返耗时对比到真实的错误隔离机制完整验证

每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。

_msearch真实省下了网络往返开销,且每条查询独立执行互不影响
这一步新验证的msearch特性

    本文用到的工具

    • 本机真实部署的 Elasticsearch 8.15.0(单节点,tar包直接启动)
    • 真实的 _msearch 批量查询 API
    京ICP备2026067502号-1京公网安备11010502063487号