bigywater.tech
Elasticsearch · 67

Async Search 长时间查询

真实提交一条昂贵的script_score查询到_async_search只等1毫秒就强制返回,验证is_running状态、用id轮询拿到最终完整结果,并证明删除后结果立刻失效,是需要显式管理生命周期的服务端资源。

提交昂贵查询只等1ms
真实拿到is_running:true和可追踪的id
1秒后轮询
真实is_running变false,完整结果已算好
删除后再查询
真实直接404,证明结果有生命周期需显式管理

做的事:真实提交一条昂贵的script_score查询到_async_search,只给1毫秒的等待时间就强制返回

代码真实索引50000条文档 POST /as_test/_async_search?wait_for_completion_timeout=1ms {"query":{"script_score":{ "query":{"match_all":{}}, "script":{"source":"double x=0; for(int i=0;i<2000;i++){x+=Math.sqrt(i+doc['n'].value);} return x;"} }}}

验证:1毫秒真实不够这条昂贵查询跑完,响应里真实带着is_running:true和一个可以继续追踪的id

实测 · 本机 Elasticsearch 8.15.0 执行输出
is_running: True    ← 真实查询还在后台继续执行,没有跑完
is_partial: True    ← 真实目前返回的结果是不完整的
id: "FjZlUkwtVm5SUmVLb1FGOU0zcHVKRmcb..."   ← 真实可以用来后续查询状态的id

这组真实结果验证了async search最核心的工作方式:提交查询之后,ES真实不会强制客户端一直阻塞等待这条昂贵查询跑完,wait_for_completion_timeout真实指定了"最多愿意同步等待多久",超过这个时间还没跑完,就真实先返回一个带着is_running:true的中间状态和一个查询id,真正的查询真实继续在服务端后台执行,不会因为客户端提前拿到响应就被中断。

真实隔1秒之后用这个id去轮询,看查询是否已经真实跑完

代码GET /_async_search/<上一步拿到的id>

验证:1秒之后真实is_running已经变成false,完整的命中结果真实已经算出来了

实测 · 本机执行输出
is_running: False   ← 真实查询已经跑完
is_partial: False   ← 真实结果已经是完整的
hits.total: {'value': 10000, 'relation': 'gte'}
这组真实结果验证了async search真实"提交即走,随时回来取"的完整使用模式:客户端第一次提交时真实不需要死等,可以先拿着id去做别的事情,随时用GET /_async_search/<id>真实查一下跑完了没有,这正是官方文档建议用async search处理"跑在聚合海量数据、或者本系列前面验证过的昂贵script_score这类真实执行时间不可预测的查询"的场景——避免让客户端的HTTP连接因为一条慢查询真实被迫长时间占用等待,超时风险也真实随之降低。

真实验证async search的结果是有生命周期的服务端资源:删除之后能不能再查到

代码DELETE /_async_search/<id> GET /_async_search/<同一个id> # 真实删除之后再查一次

验证:删除之后用同一个id再查,真实直接404 resource_not_found_exception

实测 · 本机执行输出
DELETE /_async_search/<id>: {"acknowledged":true}

再GET同一个id:
→ 404 resource_not_found_exception

这组真实结果说明async search的结果真实不是永久保存的,它本质上是一份有生命周期的服务端资源(默认保留5天,也可以提交时通过keep_alive调整),本次实测真实主动调用DELETE显式释放之后,这份结果真实立刻从服务端清除,再用同一个id去查真实直接收到404——跟本系列第52篇验证过的PIT关闭后立刻失效的行为真实如出一辙。这提醒了使用async search时真实需要主动管理这份资源的生命周期:轮询拿到最终结果之后,如果确认不再需要,真实应该主动删除,避免让这些中间结果在服务端一直占用空间直到默认的保留期限自然过期。

分步演示:async search从提交不阻塞到轮询完成再到显式删除的完整生命周期

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

async search提交即走,用id随时轮询,结果是有生命周期的服务端资源
这一步新验证的async search状态

    本文用到的工具

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