非同期検索

非同期検索APIを使用すると、検索リクエストを非同期に実行し、その進行状況を監視し、部分的な結果を利用可能になると取得できます。

非同期検索APIの送信

検索リクエストを非同期に実行します。これは、検索APIと同じパラメータとリクエストボディを受け入れます。

Python

  1. resp = client.async_search.submit(
  2. index="sales*",
  3. size="0",
  4. sort=[
  5. {
  6. "date": {
  7. "order": "asc"
  8. }
  9. }
  10. ],
  11. aggs={
  12. "sale_date": {
  13. "date_histogram": {
  14. "field": "date",
  15. "calendar_interval": "1d"
  16. }
  17. }
  18. },
  19. )
  20. print(resp)

Ruby

  1. response = client.async_search.submit(
  2. index: 'sales*',
  3. size: 0,
  4. body: {
  5. sort: [
  6. {
  7. date: {
  8. order: 'asc'
  9. }
  10. }
  11. ],
  12. aggregations: {
  13. sale_date: {
  14. date_histogram: {
  15. field: 'date',
  16. calendar_interval: '1d'
  17. }
  18. }
  19. }
  20. }
  21. )
  22. puts response

Js

  1. const response = await client.asyncSearch.submit({
  2. index: "sales*",
  3. size: 0,
  4. sort: [
  5. {
  6. date: {
  7. order: "asc",
  8. },
  9. },
  10. ],
  11. aggs: {
  12. sale_date: {
  13. date_histogram: {
  14. field: "date",
  15. calendar_interval: "1d",
  16. },
  17. },
  18. },
  19. });
  20. console.log(response);

コンソール

  1. POST /sales*/_async_search?size=0
  2. {
  3. "sort": [
  4. { "date": { "order": "asc" } }
  5. ],
  6. "aggs": {
  7. "sale_date": {
  8. "date_histogram": {
  9. "field": "date",
  10. "calendar_interval": "1d"
  11. }
  12. }
  13. }
  14. }

レスポンスには、実行中の検索の識別子が含まれています。このIDを使用して、後で検索の最終結果を取得できます。現在利用可能な検索結果は、responseオブジェクトの一部として返されます。

コンソール-結果

  1. {
  2. "id" : "FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=",
  3. "is_partial" : true,
  4. "is_running" : true,
  5. "start_time_in_millis" : 1583945890986,
  6. "expiration_time_in_millis" : 1584377890986,
  7. "response" : {
  8. "took" : 1122,
  9. "timed_out" : false,
  10. "num_reduce_phases" : 0,
  11. "_shards" : {
  12. "total" : 562,
  13. "successful" : 3,
  14. "skipped" : 0,
  15. "failed" : 0
  16. },
  17. "hits" : {
  18. "total" : {
  19. "value" : 157483,
  20. "relation" : "gte"
  21. },
  22. "max_score" : null,
  23. "hits" : [ ]
  24. }
  25. }
  26. }
進行状況を監視し、結果を取得または削除するために使用できる非同期検索の識別子
クエリがもはや実行されていない場合、検索が失敗したか、すべてのシャードで正常に完了したかを示します。クエリが実行中の間、is_partialは常にtrueに設定されます
検索がまだ実行中か、完了したかを示します
検索が実行されるシャードの数、全体
検索を正常に完了したシャードの数
現在クエリに一致しているドキュメントの数、すでに検索を完了したシャードに属する

クエリがもはや実行されていない場合、したがってis_runningfalseに設定されますが、結果は部分的である可能性があります。これは、いくつかのシャードが結果を返した後に検索が失敗した場合や、非同期検索を調整しているノードが死んだ場合に発生します。

  1. `````keep_alive`````パラメータを通じて、非同期検索がどれくらいの期間利用可能である必要があるかを指定することもできます。デフォルトは`````5d`````5日)です。この期間が経過すると、進行中の非同期検索と保存された検索結果は削除されます。
  2. 結果の主なソートがインデックスされたフィールドである場合、シャードはそのフィールドの最小値と最大値に基づいてソートされるため、要求されたソート基準に従って部分的な結果が利用可能になります。
  3. 非同期検索APIは、検索APIと同じ[パラメータ](89159571f146b334.md#search-search-api-query-params)をサポートしていますが、一部はデフォルト値が異なります:
  4. - `````batched_reduce_size``````````5`````がデフォルトです:これは、部分的な結果がどれくらいの頻度で利用可能になるかに影響します。これは、シャードの結果が減少するたびに発生します。調整ノードが新しいシャードの応答を一定数受信するたびに部分的な減少が行われます(デフォルトでは`````5`````)。
  5. - `````request_cache``````````true`````がデフォルトです
  6. - `````pre_filter_shard_size``````````1`````がデフォルトで変更できません:これは、各シャードから統計を取得するために事前フィルタのラウンドトリップを実行することを強制するためです。これにより、クエリに一致するドキュメントを持たないことが確実なものがスキップされます。
  7. - `````ccs_minimize_roundtrips``````````false`````がデフォルトです。クロスクラスター検索を行う場合、`````true`````に設定すると、特に多くのシャードを持つクラスターを検索する際に全体の検索レイテンシが改善される可能性があります。ただし、`````true`````に設定すると、リモートクラスターでの検索の進行状況は、すべてのクラスターで検索が完了するまで受信されません。詳細については、[クラスター間の検索](/read/elasticsearch-8-15/8b404b6bab699ac7.md)を参照してください。
  8. 非同期検索は、[スクロール](238327401f76c2ac.md#scroll-search-results)や、[サジェストセクション](/read/elasticsearch-8-15/39d4e7248968ca4f.md)のみを含む検索リクエストをサポートしていません。
  9. デフォルトでは、Elasticsearch10Mbを超える非同期検索レスポンスを保存することを許可しておらず、これを試みるとエラーが発生します。保存された非同期検索レスポンスの最大許可サイズは、`````search.max_async_search_response_size`````クラスターの設定を変更することで設定できます。
  10. ## 非同期検索の取得
  11. get async search APIは、指定されたIDの以前に送信された非同期検索リクエストの結果を取得します。
  12. Elasticsearchのセキュリティ機能が有効になっている場合、特定の非同期検索の結果へのアクセスは、[それを送信したユーザーまたはAPIキーのみに制限されます](d6e9ac8dde47c41d.md#can-access-resources-check)。
  13. #### Python
  14. ``````python
  15. resp = client.async_search.get(
  16. id="FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=",
  17. )
  18. print(resp)
  19. `

Ruby

  1. response = client.async_search.get(
  2. id: 'FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc='
  3. )
  4. puts response

Js

  1. const response = await client.asyncSearch.get({
  2. id: "FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=",
  3. });
  4. console.log(response);

コンソール

  1. GET /_async_search/FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=

コンソール-結果

  1. {
  2. "id" : "FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=",
  3. "is_partial" : false,
  4. "is_running" : false,
  5. "start_time_in_millis" : 1583945890986,
  6. "expiration_time_in_millis" : 1584377890986,
  7. "completion_time_in_millis" : 1583945903130,
  8. "response" : {
  9. "took" : 12144,
  10. "timed_out" : false,
  11. "num_reduce_phases" : 46,
  12. "_shards" : {
  13. "total" : 562,
  14. "successful" : 188,
  15. "skipped" : 0,
  16. "failed" : 0
  17. },
  18. "hits" : {
  19. "total" : {
  20. "value" : 456433,
  21. "relation" : "eq"
  22. },
  23. "max_score" : null,
  24. "hits" : [ ]
  25. },
  26. "aggregations" : {
  27. "sale_date" : {
  28. "buckets" : []
  29. }
  30. }
  31. }
  32. }
クエリがもはや実行されていない場合、検索が失敗したか、すべてのシャードで正常に完了したかを示します。クエリが実行中の間、is_partialは常にtrueに設定されます
検索がまだ実行中か、完了したかを示します
非同期検索がいつ期限切れになるか
非同期検索が完了した場合、completion_timeが示されます(start_time + took)
結果の減少が何回行われたかを示します。この数が最後に取得した結果と比較して増加した場合、検索レスポンスに追加の結果が含まれることが期待できます
クエリを実行したシャードの数を示します。シャードの結果が検索レスポンスに含まれるためには、最初に減少される必要があります。
クエリの実行をすでに完了したシャードからの部分的な集計結果。

wait_for_completion_timeoutパラメータは、Get Async Search APIを呼び出す際にも提供でき、指定されたタイムアウトまで検索が完了するのを待つことができます。タイムアウトが切れる前に利用可能な最終結果が返されます。そうでない場合、タイムアウトが切れた後に現在利用可能な結果が返されます。デフォルトではタイムアウトは設定されておらず、現在利用可能な結果が追加の待機なしに返されます。

  1. ## 非同期検索のステータス取得
  2. get async search status APIは、検索結果を取得せずに、指定された`````id`````の以前に送信された非同期検索リクエストのステータスのみを表示します。
  3. Elasticsearchのセキュリティ機能が有効になっている場合、特定の非同期検索のステータスへのアクセスは次のように制限されます:
  4. - 元の非同期検索リクエストを送信した[ユーザーまたはAPIキー](d6e9ac8dde47c41d.md#can-access-resources-check)。
  5. - `````monitor`````クラスター特権以上を持つユーザー。
  6. `````keep_alive`````パラメータを通じて、非同期検索がどれくらいの期間利用可能である必要があるかを指定することもできます。デフォルトは`````5d`````5日)です。この期間が経過すると、進行中の非同期検索と保存された検索結果は削除されます。
  7. #### Python
  8. ``````python
  9. resp = client.async_search.status(
  10. id="FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=",
  11. )
  12. print(resp)
  13. `

Ruby

  1. response = client.async_search.status(
  2. id: 'FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc='
  3. )
  4. puts response

Js

  1. const response = await client.asyncSearch.status({
  2. id: "FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=",
  3. });
  4. console.log(response);

コンソール

  1. GET /_async_search/status/FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=

コンソール-結果

  1. {
  2. "id" : "FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=",
  3. "is_running" : true,
  4. "is_partial" : true,
  5. "start_time_in_millis" : 1583945890986,
  6. "expiration_time_in_millis" : 1584377890986,
  7. "_shards" : {
  8. "total" : 562,
  9. "successful" : 188,
  10. "skipped" : 0,
  11. "failed" : 0
  12. }
  13. }
これまでにクエリを実行したシャードの数を示します。

完了した非同期検索の場合、ステータスレスポンスには、完了した非同期検索のステータスコードを示す追加のcompletion_statusフィールドがあります。

コンソール-結果

  1. {
  2. "id" : "FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=",
  3. "is_running" : false,
  4. "is_partial" : false,
  5. "start_time_in_millis" : 1583945890986,
  6. "expiration_time_in_millis" : 1584377890986,
  7. "_shards" : {
  8. "total" : 562,
  9. "successful" : 562,
  10. "skipped" : 0,
  11. "failed" : 0
  12. },
  13. "completion_status" : 200
  14. }
非同期検索が正常に完了したことを示します。

コンソール-結果

  1. {
  2. "id" : "FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=",
  3. "is_running" : false,
  4. "is_partial" : true,
  5. "start_time_in_millis" : 1583945890986,
  6. "expiration_time_in_millis" : 1584377890986,
  7. "_shards" : {
  8. "total" : 562,
  9. "successful" : 450,
  10. "skipped" : 0,
  11. "failed" : 112
  12. },
  13. "completion_status" : 503
  14. }
非同期検索がエラーで完了したことを示します。

非同期検索の削除

delete async search APIを使用して、IDで非同期検索を手動で削除できます。検索がまだ実行中の場合、検索リクエストはキャンセルされます。そうでない場合、保存された検索結果は削除されます。

Python

  1. resp = client.async_search.delete(
  2. id="FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=",
  3. )
  4. print(resp)

Ruby

  1. response = client.async_search.delete(
  2. id: 'FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc='
  3. )
  4. puts response

Js

  1. const response = await client.asyncSearch.delete({
  2. id: "FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=",
  3. });
  4. console.log(response);

コンソール

  1. DELETE /_async_search/FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=

Elasticsearchのセキュリティ機能が有効になっている場合、特定の非同期検索の削除は次のように制限されます: