非同期 SQL 検索の実行

デフォルトでは、SQL 検索は同期的です。完全な結果が返されるまで待機します。しかし、大規模なデータセットや フローズンデータ に対する検索では、結果が得られるまでに時間がかかることがあります。

長時間の待機を避けるために、非同期 SQL 検索を実行します。wait_for_completion_timeout を、同期結果を待つ時間に設定します。

Python

  1. resp = client.sql.query(
  2. format="json",
  3. wait_for_completion_timeout="2s",
  4. query="SELECT * FROM library ORDER BY page_count DESC",
  5. fetch_size=5,
  6. )
  7. print(resp)

Ruby

  1. response = client.sql.query(
  2. format: 'json',
  3. body: {
  4. wait_for_completion_timeout: '2s',
  5. query: 'SELECT * FROM library ORDER BY page_count DESC',
  6. fetch_size: 5
  7. }
  8. )
  9. puts response

Js

  1. const response = await client.sql.query({
  2. format: "json",
  3. wait_for_completion_timeout: "2s",
  4. query: "SELECT * FROM library ORDER BY page_count DESC",
  5. fetch_size: 5,
  6. });
  7. console.log(response);

コンソール

  1. POST _sql?format=json
  2. {
  3. "wait_for_completion_timeout": "2s",
  4. "query": "SELECT * FROM library ORDER BY page_count DESC",
  5. "fetch_size": 5
  6. }

検索がこの期間内に終了しない場合、検索は非同期になります。API は次のものを返します:

  • 検索のための id
  • 検索結果が不完全であることを示す is_partialtrue
  • バックグラウンドでまだ実行中であることを示す is_runningtrue

CSV、TSV、および TXT の応答の場合、API はそれぞれの Async-IDAsync-partial、および Async-running HTTP ヘッダーにこれらの値を返します。

コンソール-結果

  1. {
  2. "id": "FnR0TDhyWUVmUmVtWXRWZER4MXZiNFEad2F5UDk2ZVdTVHV1S0xDUy00SklUdzozMTU=",
  3. "is_partial": true,
  4. "is_running": true,
  5. "rows": [ ]
  6. }

非同期検索の進行状況を確認するには、非同期 SQL 検索ステータス API を使用して検索 ID を指定します。

Python

  1. resp = client.sql.get_async_status(
  2. id="FnR0TDhyWUVmUmVtWXRWZER4MXZiNFEad2F5UDk2ZVdTVHV1S0xDUy00SklUdzozMTU=",
  3. )
  4. print(resp)

Ruby

  1. response = client.sql.get_async_status(
  2. id: 'FnR0TDhyWUVmUmVtWXRWZER4MXZiNFEad2F5UDk2ZVdTVHV1S0xDUy00SklUdzozMTU='
  3. )
  4. puts response

Js

  1. const response = await client.sql.getAsyncStatus({
  2. id: "FnR0TDhyWUVmUmVtWXRWZER4MXZiNFEad2F5UDk2ZVdTVHV1S0xDUy00SklUdzozMTU=",
  3. });
  4. console.log(response);

コンソール

  1. GET _sql/async/status/FnR0TDhyWUVmUmVtWXRWZER4MXZiNFEad2F5UDk2ZVdTVHV1S0xDUy00SklUdzozMTU=

is_runningis_partialfalse の場合、非同期検索は完全な結果で終了しました。

コンソール-結果

  1. {
  2. "id": "FnR0TDhyWUVmUmVtWXRWZER4MXZiNFEad2F5UDk2ZVdTVHV1S0xDUy00SklUdzozMTU=",
  3. "is_running": false,
  4. "is_partial": false,
  5. "expiration_time_in_millis": 1611690295000,
  6. "completion_status": 200
  7. }

結果を取得するには、非同期 SQL 検索 API を使用して検索 ID を指定します。検索がまだ実行中の場合、wait_for_completion_timeout を使用して待機時間を指定できます。また、応答 format を指定することもできます。

Python

  1. resp = client.sql.get_async(
  2. id="FnR0TDhyWUVmUmVtWXRWZER4MXZiNFEad2F5UDk2ZVdTVHV1S0xDUy00SklUdzozMTU=",
  3. wait_for_completion_timeout="2s",
  4. format="json",
  5. )
  6. print(resp)

Ruby

  1. response = client.sql.get_async(
  2. id: 'FnR0TDhyWUVmUmVtWXRWZER4MXZiNFEad2F5UDk2ZVdTVHV1S0xDUy00SklUdzozMTU=',
  3. wait_for_completion_timeout: '2s',
  4. format: 'json'
  5. )
  6. puts response

Js

  1. const response = await client.sql.getAsync({
  2. id: "FnR0TDhyWUVmUmVtWXRWZER4MXZiNFEad2F5UDk2ZVdTVHV1S0xDUy00SklUdzozMTU=",
  3. wait_for_completion_timeout: "2s",
  4. format: "json",
  5. });
  6. console.log(response);

コンソール

  1. GET _sql/async/FnR0TDhyWUVmUmVtWXRWZER4MXZiNFEad2F5UDk2ZVdTVHV1S0xDUy00SklUdzozMTU=?wait_for_completion_timeout=2s&format=json

検索保持期間の変更

デフォルトでは、Elasticsearch は非同期 SQL 検索を 5 日間保存します。この期間が過ぎると、検索とその結果は削除されます。検索がまだ実行中であってもです。この保持期間を変更するには、keep_alive パラメータを使用します。

Python

  1. resp = client.sql.query(
  2. format="json",
  3. keep_alive="2d",
  4. wait_for_completion_timeout="2s",
  5. query="SELECT * FROM library ORDER BY page_count DESC",
  6. fetch_size=5,
  7. )
  8. print(resp)

Ruby

  1. response = client.sql.query(
  2. format: 'json',
  3. body: {
  4. keep_alive: '2d',
  5. wait_for_completion_timeout: '2s',
  6. query: 'SELECT * FROM library ORDER BY page_count DESC',
  7. fetch_size: 5
  8. }
  9. )
  10. puts response

Js

  1. const response = await client.sql.query({
  2. format: "json",
  3. keep_alive: "2d",
  4. wait_for_completion_timeout: "2s",
  5. query: "SELECT * FROM library ORDER BY page_count DESC",
  6. fetch_size: 5,
  7. });
  8. console.log(response);

コンソール

  1. POST _sql?format=json
  2. {
  3. "keep_alive": "2d",
  4. "wait_for_completion_timeout": "2s",
  5. "query": "SELECT * FROM library ORDER BY page_count DESC",
  6. "fetch_size": 5
  7. }

後で保持期間を変更するには、非同期 SQL 検索 API の keep_alive パラメータを使用できます。新しい期間はリクエストが実行された後に開始されます。

Python

  1. resp = client.sql.get_async(
  2. id="FmdMX2pIang3UWhLRU5QS0lqdlppYncaMUpYQ05oSkpTc3kwZ21EdC1tbFJXQToxOTI=",
  3. keep_alive="5d",
  4. wait_for_completion_timeout="2s",
  5. format="json",
  6. )
  7. print(resp)

Ruby

  1. response = client.sql.get_async(
  2. id: 'FmdMX2pIang3UWhLRU5QS0lqdlppYncaMUpYQ05oSkpTc3kwZ21EdC1tbFJXQToxOTI=',
  3. keep_alive: '5d',
  4. wait_for_completion_timeout: '2s',
  5. format: 'json'
  6. )
  7. puts response

Js

  1. const response = await client.sql.getAsync({
  2. id: "FmdMX2pIang3UWhLRU5QS0lqdlppYncaMUpYQ05oSkpTc3kwZ21EdC1tbFJXQToxOTI=",
  3. keep_alive: "5d",
  4. wait_for_completion_timeout: "2s",
  5. format: "json",
  6. });
  7. console.log(response);

コンソール

  1. GET _sql/async/FmdMX2pIang3UWhLRU5QS0lqdlppYncaMUpYQ05oSkpTc3kwZ21EdC1tbFJXQToxOTI=?keep_alive=5d&wait_for_completion_timeout=2s&format=json

keep_alive 期間が終了する前に非同期検索を削除するには、非同期 SQL 検索削除 API を使用します。検索がまだ実行中の場合、Elasticsearch はそれをキャンセルします。

Python

  1. resp = client.sql.delete_async(
  2. id="FmdMX2pIang3UWhLRU5QS0lqdlppYncaMUpYQ05oSkpTc3kwZ21EdC1tbFJXQToxOTI=",
  3. )
  4. print(resp)

Ruby

  1. response = client.sql.delete_async(
  2. id: 'FmdMX2pIang3UWhLRU5QS0lqdlppYncaMUpYQ05oSkpTc3kwZ21EdC1tbFJXQToxOTI='
  3. )
  4. puts response

Js

  1. const response = await client.sql.deleteAsync({
  2. id: "FmdMX2pIang3UWhLRU5QS0lqdlppYncaMUpYQ05oSkpTc3kwZ21EdC1tbFJXQToxOTI=",
  3. });
  4. console.log(response);

コンソール

  1. DELETE _sql/async/delete/FmdMX2pIang3UWhLRU5QS0lqdlppYncaMUpYQ05oSkpTc3kwZ21EdC1tbFJXQToxOTI=

同期 SQL 検索の保存

デフォルトでは、Elasticsearch は非同期 SQL 検索のみを保存します。同期検索を保存するには、wait_for_completion_timeout を指定し、keep_on_completiontrue に設定します。

Python

  1. resp = client.sql.query(
  2. format="json",
  3. keep_on_completion=True,
  4. wait_for_completion_timeout="2s",
  5. query="SELECT * FROM library ORDER BY page_count DESC",
  6. fetch_size=5,
  7. )
  8. print(resp)

Ruby

  1. response = client.sql.query(
  2. format: 'json',
  3. body: {
  4. keep_on_completion: true,
  5. wait_for_completion_timeout: '2s',
  6. query: 'SELECT * FROM library ORDER BY page_count DESC',
  7. fetch_size: 5
  8. }
  9. )
  10. puts response

Js

  1. const response = await client.sql.query({
  2. format: "json",
  3. keep_on_completion: true,
  4. wait_for_completion_timeout: "2s",
  5. query: "SELECT * FROM library ORDER BY page_count DESC",
  6. fetch_size: 5,
  7. });
  8. console.log(response);

コンソール

  1. POST _sql?format=json
  2. {
  3. "keep_on_completion": true,
  4. "wait_for_completion_timeout": "2s",
  5. "query": "SELECT * FROM library ORDER BY page_count DESC",
  6. "fetch_size": 5
  7. }

is_partialis_runningfalse の場合、検索は同期的であり、完全な結果が返されました。

コンソール-結果

  1. {
  2. "id": "Fnc5UllQdUVWU0NxRFNMbWxNYXplaFEaMUpYQ05oSkpTc3kwZ21EdC1tbFJXQTo0NzA=",
  3. "is_partial": false,
  4. "is_running": false,
  5. "rows": ...,
  6. "columns": ...,
  7. "cursor": ...
  8. }

後で 非同期 SQL 検索 API を使用して検索 ID で同じ結果を取得できます。

保存された同期検索は、keep_alive の保持期間の対象となります。この期間が終了すると、Elasticsearch は検索結果を削除します。また、非同期 SQL 検索削除 API を使用して保存された検索を削除することもできます。