非同期 SQL 検索の実行
デフォルトでは、SQL 検索は同期的です。完全な結果が返されるまで待機します。しかし、大規模なデータセットや フローズンデータ に対する検索では、結果が得られるまでに時間がかかることがあります。
長時間の待機を避けるために、非同期 SQL 検索を実行します。wait_for_completion_timeout
を、同期結果を待つ時間に設定します。
Python
resp = client.sql.query(
format="json",
wait_for_completion_timeout="2s",
query="SELECT * FROM library ORDER BY page_count DESC",
fetch_size=5,
)
print(resp)
Ruby
response = client.sql.query(
format: 'json',
body: {
wait_for_completion_timeout: '2s',
query: 'SELECT * FROM library ORDER BY page_count DESC',
fetch_size: 5
}
)
puts response
Js
const response = await client.sql.query({
format: "json",
wait_for_completion_timeout: "2s",
query: "SELECT * FROM library ORDER BY page_count DESC",
fetch_size: 5,
});
console.log(response);
コンソール
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": [ ]
}
非同期検索の進行状況を確認するには、非同期 SQL 検索ステータス API を使用して検索 ID を指定します。
Python
resp = client.sql.get_async_status(
id="FnR0TDhyWUVmUmVtWXRWZER4MXZiNFEad2F5UDk2ZVdTVHV1S0xDUy00SklUdzozMTU=",
)
print(resp)
Ruby
response = client.sql.get_async_status(
id: 'FnR0TDhyWUVmUmVtWXRWZER4MXZiNFEad2F5UDk2ZVdTVHV1S0xDUy00SklUdzozMTU='
)
puts response
Js
const response = await client.sql.getAsyncStatus({
id: "FnR0TDhyWUVmUmVtWXRWZER4MXZiNFEad2F5UDk2ZVdTVHV1S0xDUy00SklUdzozMTU=",
});
console.log(response);
コンソール
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
}
結果を取得するには、非同期 SQL 検索 API を使用して検索 ID を指定します。検索がまだ実行中の場合、wait_for_completion_timeout
を使用して待機時間を指定できます。また、応答 format
を指定することもできます。
Python
resp = client.sql.get_async(
id="FnR0TDhyWUVmUmVtWXRWZER4MXZiNFEad2F5UDk2ZVdTVHV1S0xDUy00SklUdzozMTU=",
wait_for_completion_timeout="2s",
format="json",
)
print(resp)
Ruby
response = client.sql.get_async(
id: 'FnR0TDhyWUVmUmVtWXRWZER4MXZiNFEad2F5UDk2ZVdTVHV1S0xDUy00SklUdzozMTU=',
wait_for_completion_timeout: '2s',
format: 'json'
)
puts response
Js
const response = await client.sql.getAsync({
id: "FnR0TDhyWUVmUmVtWXRWZER4MXZiNFEad2F5UDk2ZVdTVHV1S0xDUy00SklUdzozMTU=",
wait_for_completion_timeout: "2s",
format: "json",
});
console.log(response);
コンソール
GET _sql/async/FnR0TDhyWUVmUmVtWXRWZER4MXZiNFEad2F5UDk2ZVdTVHV1S0xDUy00SklUdzozMTU=?wait_for_completion_timeout=2s&format=json
検索保持期間の変更
デフォルトでは、Elasticsearch は非同期 SQL 検索を 5 日間保存します。この期間が過ぎると、検索とその結果は削除されます。検索がまだ実行中であってもです。この保持期間を変更するには、keep_alive
パラメータを使用します。
Python
resp = client.sql.query(
format="json",
keep_alive="2d",
wait_for_completion_timeout="2s",
query="SELECT * FROM library ORDER BY page_count DESC",
fetch_size=5,
)
print(resp)
Ruby
response = client.sql.query(
format: 'json',
body: {
keep_alive: '2d',
wait_for_completion_timeout: '2s',
query: 'SELECT * FROM library ORDER BY page_count DESC',
fetch_size: 5
}
)
puts response
Js
const response = await client.sql.query({
format: "json",
keep_alive: "2d",
wait_for_completion_timeout: "2s",
query: "SELECT * FROM library ORDER BY page_count DESC",
fetch_size: 5,
});
console.log(response);
コンソール
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
パラメータを使用できます。新しい期間はリクエストが実行された後に開始されます。
Python
resp = client.sql.get_async(
id="FmdMX2pIang3UWhLRU5QS0lqdlppYncaMUpYQ05oSkpTc3kwZ21EdC1tbFJXQToxOTI=",
keep_alive="5d",
wait_for_completion_timeout="2s",
format="json",
)
print(resp)
Ruby
response = client.sql.get_async(
id: 'FmdMX2pIang3UWhLRU5QS0lqdlppYncaMUpYQ05oSkpTc3kwZ21EdC1tbFJXQToxOTI=',
keep_alive: '5d',
wait_for_completion_timeout: '2s',
format: 'json'
)
puts response
Js
const response = await client.sql.getAsync({
id: "FmdMX2pIang3UWhLRU5QS0lqdlppYncaMUpYQ05oSkpTc3kwZ21EdC1tbFJXQToxOTI=",
keep_alive: "5d",
wait_for_completion_timeout: "2s",
format: "json",
});
console.log(response);
コンソール
GET _sql/async/FmdMX2pIang3UWhLRU5QS0lqdlppYncaMUpYQ05oSkpTc3kwZ21EdC1tbFJXQToxOTI=?keep_alive=5d&wait_for_completion_timeout=2s&format=json
keep_alive
期間が終了する前に非同期検索を削除するには、非同期 SQL 検索削除 API を使用します。検索がまだ実行中の場合、Elasticsearch はそれをキャンセルします。
Python
resp = client.sql.delete_async(
id="FmdMX2pIang3UWhLRU5QS0lqdlppYncaMUpYQ05oSkpTc3kwZ21EdC1tbFJXQToxOTI=",
)
print(resp)
Ruby
response = client.sql.delete_async(
id: 'FmdMX2pIang3UWhLRU5QS0lqdlppYncaMUpYQ05oSkpTc3kwZ21EdC1tbFJXQToxOTI='
)
puts response
Js
const response = await client.sql.deleteAsync({
id: "FmdMX2pIang3UWhLRU5QS0lqdlppYncaMUpYQ05oSkpTc3kwZ21EdC1tbFJXQToxOTI=",
});
console.log(response);
コンソール
DELETE _sql/async/delete/FmdMX2pIang3UWhLRU5QS0lqdlppYncaMUpYQ05oSkpTc3kwZ21EdC1tbFJXQToxOTI=
同期 SQL 検索の保存
デフォルトでは、Elasticsearch は非同期 SQL 検索のみを保存します。同期検索を保存するには、wait_for_completion_timeout
を指定し、keep_on_completion
を true
に設定します。
Python
resp = client.sql.query(
format="json",
keep_on_completion=True,
wait_for_completion_timeout="2s",
query="SELECT * FROM library ORDER BY page_count DESC",
fetch_size=5,
)
print(resp)
Ruby
response = client.sql.query(
format: 'json',
body: {
keep_on_completion: true,
wait_for_completion_timeout: '2s',
query: 'SELECT * FROM library ORDER BY page_count DESC',
fetch_size: 5
}
)
puts response
Js
const response = await client.sql.query({
format: "json",
keep_on_completion: true,
wait_for_completion_timeout: "2s",
query: "SELECT * FROM library ORDER BY page_count DESC",
fetch_size: 5,
});
console.log(response);
コンソール
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": ...
}
後で 非同期 SQL 検索 API を使用して検索 ID で同じ結果を取得できます。
保存された同期検索は、keep_alive
の保持期間の対象となります。この期間が終了すると、Elasticsearch は検索結果を削除します。また、非同期 SQL 検索削除 API を使用して保存された検索を削除することもできます。