运行异步 SQL 搜索
Elastic Stack Serverless
默认情况下,SQL 搜索是同步的。它们会等待完整结果后再返回响应。但是,对于跨大型数据集或冻结数据的搜索,结果可能需要更长时间。
为避免长时间等待,请运行异步 SQL 搜索。将 wait_for_completion_timeout 设置为您希望等待同步结果的时长。
POST _sql?format=json {
"wait_for_completion_timeout": "2s",
"query": "SELECT * FROM library ORDER BY page_count DESC",
"fetch_size": 5
}
如果在该时间段内搜索未完成,则搜索将变为异步。API 将返回
- 搜索的
id。 is_partial值为true,表示搜索结果不完整。is_running值为true,表示搜索仍在后台运行。
对于 CSV、TSV 和 TXT 响应,API 将在相应的 Async-ID、Async-partial 和 Async-running HTTP 标头中返回这些值。
{
"id": "FnR0TDhyWUVmUmVtWXRWZER4MXZiNFEad2F5UDk2ZVdTVHV1S0xDUy00SklUdzozMTU=",
"is_partial": true,
"is_running": true,
"rows": [ ]
}
要检查异步搜索的进度,请使用搜索 ID 和获取异步 SQL 搜索状态 API。
GET _sql/async/status/FnR0TDhyWUVmUmVtWXRWZER4MXZiNFEad2F5UDk2ZVdTVHV1S0xDUy00SklUdzozMTU=
如果 is_running 和 is_partial 均为 false,则表示异步搜索已完成并返回完整结果。
{
"id": "FnR0TDhyWUVmUmVtWXRWZER4MXZiNFEad2F5UDk2ZVdTVHV1S0xDUy00SklUdzozMTU=",
"is_running": false,
"is_partial": false,
"expiration_time_in_millis": 1611690295000,
"completion_status": 200
}
要获取结果,请使用搜索 ID 和获取异步 SQL 搜索 API。如果搜索仍在运行,请使用 wait_for_completion_timeout 指定您希望等待的时长。您还可以指定响应 format。
GET _sql/async/FnR0TDhyWUVmUmVtWXRWZER4MXZiNFEad2F5UDk2ZVdTVHV1S0xDUy00SklUdzozMTU=?wait_for_completion_timeout=2s&format=json
默认情况下,Elasticsearch 会存储异步 SQL 搜索五天。在此期间后,Elasticsearch 将删除搜索及其结果,即使搜索仍在运行。要更改此保留期,请使用 keep_alive 参数。
POST _sql?format=json {
"keep_alive": "2d",
"wait_for_completion_timeout": "2s",
"query": "SELECT * FROM library ORDER BY page_count DESC",
"fetch_size": 5
}
您可以使用获取异步 SQL 搜索 API 的 keep_alive 参数稍后更改保留期。新的保留期在请求运行后开始。
GET _sql/async/FmdMX2pIang3UWhLRU5QS0lqdlppYncaMUpYQ05oSkpTc3kwZ21EdC1tbFJXQToxOTI=?keep_alive=5d&wait_for_completion_timeout=2s&format=json
使用删除异步 SQL 搜索 API 在 keep_alive 期间结束前删除异步搜索。如果搜索仍在运行,Elasticsearch 将取消它。
DELETE _sql/async/delete/FmdMX2pIang3UWhLRU5QS0lqdlppYncaMUpYQ05oSkpTc3kwZ21EdC1tbFJXQToxOTI=
默认情况下,Elasticsearch 只存储异步 SQL 搜索。要保存同步搜索,请指定 wait_for_completion_timeout 并将 keep_on_completion 设置为 true。
POST _sql?format=json {
"keep_on_completion": true,
"wait_for_completion_timeout": "2s",
"query": "SELECT * FROM library ORDER BY page_count DESC",
"fetch_size": 5
}
如果 is_partial 和 is_running 均为 false,则表示搜索是同步的并且返回了完整结果。
{
"id": "Fnc5UllQdUVWU0NxRFNMbWxNYXplaFEaMUpYQ05oSkpTc3kwZ21EdC1tbFJXQTo0NzA=",
"is_partial": false,
"is_running": false,
"rows": ...,
"columns": ...,
"cursor": ...
}
您稍后可以使用搜索 ID 和获取异步 SQL 搜索 API 来获取相同的结果。
保存的同步搜索仍受 keep_alive 保留期的约束。当该期结束时,Elasticsearch 将删除搜索结果。您也可以使用删除异步 SQL 搜索 API 删除已保存的搜索。