コレクションは、標準的な Elasticsearch のドキュメントおよびクエリ API の主要な呼び出し規則に従い、`_slice` を使用してビジネスデータのスコープを指定します。アプリケーション開発における最も一般的な操作は、ドキュメントの書き込みと読み取り、クエリの可視性の制御、クエリ範囲の指定です。次のセクションのアクセスメソッド表には、サポートされている各アクセスメソッドとそのシナリオがリストされています。
ドキュメントの書き込みと読み取り
| アクセス方法 | シナリオ |
| 単一ドキュメント API | ドキュメント ID とその Slice が既知の場合のリアルタイムな作成、読み取り、更新、削除操作。 |
| Bulk | ログやナレッジベースのコンテンツの一括書き込み、または一度のバッチでの複数の Slice への書き込み。 |
| MGet | 複数のドキュメント ID が既知の場合に、1つのリクエストで同じまたは異なる Slice からドキュメントを読み取る。 |
| インデックスの再作成 | 通常のインデックスとコレクション間、または異なるコレクション間のデータ移行。 |
単一ドキュメント API:
| 操作 | API |
| ドキュメントの書き込みまたは上書き | PUT /{collection}/_doc/{id}?_slice={slice} |
| ドキュメント ID の自動生成 | POST /{collection}/_doc?_slice={slice} |
| ドキュメントの作成のみ | PUT /{collection}/_create/{id}?_slice={slice} |
| ドキュメントの取得 | GET /{collection}/_doc/{id}?_slice={slice} |
| ドキュメントの存在確認 | HEAD /{collection}/_doc/{id}?_slice={slice} |
_source の取得 | GET /{collection}/_source/{id}?_slice={slice} |
| ドキュメントの更新 | POST /{collection}/_update/{id}?_slice={slice} |
| ドキュメントの削除 | DELETE /{collection}/_doc/{id}?_slice={slice} |
以下のルールに従ってください:
単一ドキュメントのリクエストでは、1つの Slice のみ指定できます。カンマ区切りのリストや
_allは使用できません。
index、create、またはupdateは、auto_create_slice=trueが設定されている場合、存在しない Slice を自動的に登録できます。読み取りおよび削除操作は Slice を自動的に登録せず、存在しない Slice を指定すると HTTP 404 が返されます。
ドキュメントは、コレクション、ビジネス Slice 名、および
_idの組み合わせによって一意に特定されます。異なる Slice は同じ_idを使用できます。アプリケーションがドキュメントを読み取り、更新、または削除する場合、対応する Slice を指定する必要があります。_idだけでテナントを区別しないでください。
Bulk リクエストには、Bulk セクションで説明されている別の Slice 自動登録クォータが適用されます。
wait_for_active_shardsは、Agent エンジンの書き込みパスでレプリカを待機する条件としては使用されません。ほとんどの場合、バックグラウンドリフレッシュによってクエリの可視性が提供されます。書き込みリクエストが返される前にデータを検索可能にする必要がある場合は、後述の適用条件下でrefresh=wait_forを使用します。
ベクトル値はデフォルトでは返されません。通常の読み取りおよび検索操作は、ビジネスで必要なフィールドのみを返します。ベクトル値の検証またはエクスポートについては、「必要に応じたベクトル値の読み取り」をご参照ください。
応答では、_indexと_routingは、リクエストで使用されたコレクション名とビジネス Slice 名の代わりに、基盤となるインデックス名とシステムが生成した内部 Slice 識別子 (slice_uid) を返す場合があります。後続のリクエストでは引き続きビジネス名を使い、これらの内部値を返さないでください。詳細については、「リクエストターゲットと応答識別子」をご参照ください。
リフレッシュとクエリの可視性
通常の書き込みでは、refreshを渡さないでください。バックグラウンドでの自動リフレッシュを待機してください。書き込みが成功したということは、データが永続化されたことを意味します。ID によるドキュメントの読み取りと条件による検索では、可視性の動作が異なります。次のセクションでは、シナリオに合った読み取り方法とリフレッシュ動作の選択方法について説明します。
リフレッシュなしでの ID による書き込み確認
書き込んだばかりのドキュメントのみを確認するには、GET または MGet を使用します。どちらもデフォルトでリアルタイム読み取り (realtime=true) を有効にするため、明示的にパラメーターを渡したり、手動リフレッシュをトリガーしたりする必要はありません。例えば、書き込みリクエストが成功した後、同じ Slice とドキュメント ID でドキュメントを読み取ります:
GET /knowledge-chunks/_doc/chunk-1001?_slice=tenant-a返された found の値とビジネスフィールドを確認します。MGet の場合は、各結果を確認します。リアルタイム読み取りは、すべての障害ウィンドウで強力な整合性を保証するものではありません。プライマリシャードが利用できない場合、または移行や再起動によってリアルタイム読み取りソースが一時的に利用できなくなった場合、GET と MGet はコミットされたデータビューにフォールバックすることがあります。その場合、以前のバージョンを返すか、まだそのビューに入っていないドキュメントに対して found=false を返します。この場合、書き込み結果とクラスターの状態から結果を判断し、限られた回数のリトライの後に再確認してください。1回の not-found 応答に基づいて書き込みが失われたと結論付けないでください。
条件による検索とバックグラウンドでの自動リフレッシュの待機
Search、Count、および KNN クエリは、データがクエリノードで検索可能になるまで待機する必要があります。Agent エンジンバージョンには、デフォルトの自動リフレッシュ間隔5s があり、通常のインデックスまたはコレクションを作成するときに設定する必要はありません。従来のステートフルな Elasticsearch のデフォルトは 1s です。データが検索可能になるまでの実際の時間は、データパブリケーション、クエリノードの負荷、およびワークロードにも影響されます。5s は保証された可視性の期限ではありません。
GET /{collection}/_settings を使用して明示的に設定した設定のみを表示し、include_defaults=true を追加してデフォルト値も返すようにします。PUT /{collection}/_settings を使用して設定を調整します。本番ワークロードでは自動リフレッシュを有効にしておいてください。間隔は少なくとも5s に設定してください。より短い間隔は、インデックスノードでのデータパブリケーション、オブジェクトストレージ I/O、およびクエリノードでのリフレッシュオーバーヘッドを増加させます。書き込みワークロードを制御するには、間隔を適宜長くし、結果として生じるデータ可視性レイテンシを評価してください。
refresh=wait_for は限定的なシナリオでのみ使用
refresh=wait_for は、1回限りで低頻度のビジネス同期ポイントのみを対象としています。以下のすべての条件が満たされる場合にのみ使用してください:(1) 処理を続行する前にバッチが検索可能になる必要がある、(2) パラメーターが Bulk バッチと共に使用される、(3) 同時待機が制限されている、(4) 自動リフレッシュが有効なままである、(5) 待機時間がビジネスのレイテンシとスループットに与える影響を評価済みである。ID による書き込みを確認するには、GET または MGet を使用します。継続的なインポートや通常の書き込みにはこのパラメーターを渡さないでください。
このパラメーターはリフレッシュを待機し、クエリレプリカでの可視性を調整します。同時待機が多すぎたり、リフレッシュリスナーが枯渇したりすると、強制リフレッシュがトリガーされることもあり、これは応答の forced_refresh: true で識別できます。強制リフレッシュがトリガーされた場合でも、リクエストはクエリ側の可視性を待ち続ける可能性があり、すぐに返されるとは限りません。クライアントのタイムアウトは、書き込みが行われなかったことを意味しません。リフレッシュを高速化するために同時待機を増やさないでください。
手動リフレッシュは、独立した検証または O&M ウィンドウでのみ使用
アプリケーションのコードパスにrefresh=trueを追加したり、_refreshを呼び出したりしないでください。各インポートバッチの後に自動的にリフレッシュしないでください。refresh=true は即時の分散リフレッシュをトリガーし、データパブリケーション、オブジェクトストレージ I/O、およびクエリノードでのリフレッシュオーバーヘッドを増加させます。バックグラウンドでの自動リフレッシュが標準的な代替手段です。
POST /{collection}/_refresh は、コレクション全体のすべての Backing とすべてのテナントに影響します。自身の Slice のデータ量からそのオーバーヘッドを見積もることはできず、Backing の数とデータ量が増えるにつれて同じリクエストの影響は増大します。_slice で範囲を絞り込むことはできません。このエンドポイントに _slice を渡すと HTTP 400 が返されます。コレクションは、アプリケーション呼び出し用の単一 Backing リフレッシュエンドポイントを提供しません。
手動リフレッシュは、少量のデモデータを含む別途作成された検証用コレクション、または管理者がコレクション全体のサイズを評価した上でスケジュールした低頻度の O&M ウィンドウ中にのみ使用してください。次のセクションで説明する1回限りのオフラインインポートは、そのようなウィンドウの1つです。リフレッシュ後、_shards.failed を確認してください。通常のオンラインインポートは、バックグラウンドでの自動リフレッシュを待つ必要があります。データをプリウォームする必要がある場合は、データが検索可能になった後に行ってください。
自動リフレッシュの無効化は、1回限りのオフラインインポートでのみ
本番環境のコレクションに対して index.refresh_interval=-1 を設定しないでください。この設定は自動リフレッシュを無効にするため、検索は新しく書き込まれたデータを時間内に見ることができません。refresh=wait_for と組み合わせると、リクエストが長時間待機したり、タイムアウトしたりする可能性があります。
唯一の例外は、対象のコレクション全体に対して明確に定義された1回限りのオフラインインポートウィンドウで、その間、関連するテナントはクエリを実行しません。そのウィンドウ内で、次の手順を順番に完了してください:(1) インポート中に refresh を省略します。(2) インポートが完了したら、PUT /{collection}/_settings を呼び出して、5s または以前の少なくとも 5s の間隔に戻します。(3) 同じウィンドウ内で、インポートタスクに _refresh を一度実行させ、応答の _shards.failed を確認します。(4) クエリがインポートされたデータを返すことを確認します。(5) ワークロードがコールドクエリのレイテンシに敏感な場合は、本番トラフィックを再開する前にデータをプリウォームします。他のテナントにサービスを提供しているコレクションにはこのプロセスを使用しないでください。
リフレッシュはクエリの可視性のみを扱います。すべてのクエリレプリカが利用可能であることを意味するものではなく、クエリプローブや高可用性 (HA) チェックの代わりにはなりません。
Bulk
各 Bulk アイテムは、アクションメタデータ内で独自の _slice を提供できます。例については、「クイックスタートの Bulk 書き込み例」をご参照ください。バッチ全体が同じ Slice に書き込まれる場合は、URL でデフォルト値を指定することもできます:
POST /knowledge-chunks/_bulk?_slice=tenant-a
{ "index": { "_id": "chunk-2001" } }
{ "tenant_id": "tenant-a", "document_id": "doc-account-security", "title": "Account security settings", "content": "An administrator can enable multi-factor authentication on the security settings page." }アイテム内の _slice の値は、URL のデフォルト値をオーバーライドできます。各 Bulk リクエストは、最大 512 個の存在しない Slice を自動的に登録します。既存の Slice はこの制限にはカウントされません。名前空間モードでは、ドキュメントフィールドから Slice を派生させません。ドキュメント本文に tenant_id のようなフィールドが含まれていても、実際の書き込み場所は _slice によって決定されます。返された各アイテムの結果を確認して、書き込みが成功したことを確認してください。エラー処理については、「一般的な API 規則」をご参照ください。
MGet
MGet を使用して、既知の ID を持つ複数のドキュメントを1つのリクエストで読み取ります。各アイテムは異なる Slice をターゲットにできます:
POST /knowledge-chunks/_mget
{
"docs": [
{ "_id": "chunk-1001", "_slice": "tenant-a" },
{ "_id": "chunk-1001", "_slice": "tenant-b" }
]
}これら2つのアイテムは、異なるテナントから同じ ID のドキュメントを読み取ります。クイックスタートのサンプルデータを使用すると、返されるタイトルは「Refund and return policy」と「Track shipment status」です。ご自身のデータをクエリする場合は、found、ビジネスフィールド、および各アイテムのエラーに基づいて結果を判断してください。URL の _slice は、各アイテムがオーバーライドできるデフォルト値として機能します。各アイテムは、正確に1つの Slice に解決される必要があります。
インデックスの再作成
インデックスの再作成を呼び出す前に、「コレクションのインデックス再作成に関する API サポート範囲」、特にスクリプト、送信先パイプライン、およびリモートソースに関する制限事項を確認してください。
通常のインデックスとコレクション間、またはコレクション間でデータを移行する場合は、インデックスの再作成を使用します。同じコレクション内で Slice をコピーするには、「Copy Slice」を使用します。
ソースがコレクションの場合、リクエストボディで source._slice を明示的に指定する必要があります。そうしないと、リクエストは HTTP 400 を返します。送信先がコレクションの場合、1つの送信先 Slice のみ指定でき、送信先の値は ={slice} 形式を使用する必要があります。
タスクを実行する前に、送信先コレクションを作成し、ソースドキュメントを受け入れられるマッピングを設定し、「Backing の事前作成」に従って容量を準備し、送信先 Slice を登録します。移行するソースデータが検索可能であることを確認してください。インデックスの再作成は後続の書き込みを継続的に同期しないため、本番への切り替え前に増分データも処理する必要があります。
デフォルトでは、インデックスの再作成はドキュメントの _id を保持し、送信先で同じ ID を持つドキュメントを上書きする可能性があります。複数のソース Slice を1つの送信先 Slice にマージする前に、ドキュメント ID がそれらの Slice 間でも一意であることを確認してください。そうでない場合は、それらを異なる送信先 Slice に移行するか、アプリケーションがドキュメントをインポートする前に新しい一意の ID を生成するようにしてください。
次の例では、非同期実行、単一タスク、バッチあたり 500 ドキュメント、および秒間 500 ドキュメントの目標レートを使用しています。これらの設定から始めて、オンラインワークロードへの移行の影響を制御し、ワークロードに基づいて調整してください。requests_per_second は、秒間 HTTP リクエスト数ではなく、バッチ間のドキュメント数によってスロットルします:
POST /_reindex?wait_for_completion=false&slices=1&requests_per_second=500
{
"source": {
"index": "source-knowledge-chunks",
"_slice": "tenant-a",
"size": 500
},
"dest": {
"index": "target-knowledge-chunks",
"_slice": "=tenant-archive"
}
}応答から task の値を保存し、completed=true になるまで GET /_tasks/{task_id} を定期的にポーリングします。結果の error、failures、および version_conflicts を確認してください。タスクの完了は、すべての送信先データが検索可能であることを意味するものではありません。切り替え前に、バックグラウンドリフレッシュを待ち、送信先の結果を検証し、アクセスされる Slice をプリウォームしてください。
以下のルールに注意してください:
source._sliceは、1つの Slice、複数の Slice、または_allをサポートします。インデックスの再作成リクエストボディはsource.routingを受け付けず、これを渡すと HTTP 400 が返されます。
送信先は
"_slice": "=slice-name"または"routing": "=slice-name"を使用できますが、両方は使用できません。先頭の=は保持する必要があります。
送信先 Slice が存在しない場合、
auto_create_slice=trueが設定されている場合にのみ自動的に登録されます。
トップレベルの
slicesパラメーターは、Elasticsearch のインデックス再作成の並列度を指定するものであり、ビジネス Slice の数とは無関係です。
コレクションから通常のインデックスに書き込む際に、ルーティングを保持する必要がない場合は、
"dest": { "routing": "discard" }を設定します。
クエリ範囲の指定
このセクションでは、Agent エンジンバージョンが追加する Slice クエリ範囲について説明します。その他のエンドポイントパラメーターは、標準的な Elasticsearch API のセマンティクスに従います。既知の制限事項については、「API サポート範囲」をご参照ください。
| クエリ範囲 | シナリオ | 例 |
| 1つの Slice | 1つのテナントのオンラインクエリ、指定された名前空間内での検索 | GET /knowledge-chunks/_search?_slice=tenant-a |
| 複数の Slice | 少数の既知のテナントに対する集約クエリ、少数の名前空間にまたがるクエリ | GET /knowledge-chunks/_search?_slice=tenant-a,tenant-b |
1つのクエリで最大 1,024 個の Slice を指定できます。HTTP リクエスト行の長さ制限も適用されます。Slice 名が長い場合、リクエストは数制限に達する前に too_long_http_line_exception を返す可能性があります。Slice 名を短くするか、リクエストを複数のクエリに分割してください。
コレクションクエリは、デフォルトでクエリとプリウォーミングのアフィニティを有効にします。この設定が有効な間、アフィニティルールはリクエスト内の preference をオーバーライドし、応答は追加の通知を行いません。preference を使用してノード選択を制御するには、管理者がこの設定を無効にする必要があります。この設定はクラスター全体に適用されるため、無効にするとすべてのコレクションに適用されます。
本番環境のクエリでは、_slice=_allを使用しないでください。このパラメーターはコレクション全体を検索し、シャードリクエスト、集約、およびクエリノードでのオブジェクトストレージ読み取りのオーバーヘッドは、Backing とシャードの数とともに増加します。アプリケーションは、1つの既知の Slice または少数の既知の Slice を指定する必要があります。GET /knowledge-chunks/_search?_slice=_all は、真にすべてのデータを必要とする専用の分析、監査、または O&M タスクにのみ使用し、コレクション全体の負荷を評価し、同時実行数を制限し、タイムアウトを設定した後にのみ使用してください。
ベータ段階でBranch Slice (ベータ版)を使用する場合、複数 Slice クエリと _slice=_all は、スコープにまだ通常の Slice に変換されていないブランチが含まれている場合、HTTP 409 を返します。この機能を使用しないワークロードは影響を受けません。
クエリリストに存在しない Slice が含まれる可能性がある場合は、ignore_missing_slice を使用します:
GET /knowledge-chunks/_search?_slice=tenant-a,tenant-b&ignore_missing_slice=true存在しない可能性のあるオプションの Slice については、ignore_missing_slice=true を設定して、1つの Slice が見つからないためにバッチ全体をリトライすることを避けてください。このパラメーターがない場合、いずれかの Slice が存在しないとリクエスト全体が HTTP 404 を返します。このパラメーターは名前付きの Slice にのみ影響します。_slice=_all と一緒に使用すると、パラメーターはエラーなしで無視されます。
以下のクエリ エンドポイントは、同じ Slice スコープ パラメーターをサポートしています:
Search および Count
Multi search
Search template
Async search
Validate query
Search shards
Update by query および Delete by query
Explain は、ドキュメントがクエリに一致する理由を説明します。1つの Slice のみ指定できます。カンマ区切りのリストや_allは使用できません:
POST /knowledge-chunks/_explain/chunk-1001?_slice=tenant-a
{
"query": {
"match": { "content": "refund" }
}
}Update by query、Delete by query、およびコレクションをターゲットとするインデックスの再作成操作では、ターゲット Slice を明示的に指定する必要があります。そうしないと、リクエストは HTTP 400 で拒否されます。
_slice が指定されていない場合のデフォルトの動作
名前空間モード (exact) では、Search、Count、Search Template、Async Search、Validate Query、および Search Shards はデフォルトで _slice を要求します。このパラメーターがない場合、リクエストは失敗します。前述のフルクエリ条件を満たす少数の専用タスクについては、グローバルなデフォルトの動作を変更する代わりに、それらのリクエストで _slice=_all を明示的に渡してください。ベクトルクラスターリコールモードは、クエリベクトルに基づいて候補 Slice を自動的に選択できます。詳細については、「ベクトルクラスターリコールモード」をご参照ください。
デフォルトでは、フルクエリフォールバックを無効にしておいてください。クラスター設定 apack.slice_collection.search.default_to_all_slices はこのフォールバックを制御し、この設定はすべてのコレクションに影響します。名前空間モードでは、_slice が指定されていない場合、クエリはすべての Slice にフォールバックします。ベクトルクラスターモードは、スコープが指定されておらず、設定パスにクエリベクトルが含まれていない場合にのみフルクエリにフォールバックします。有効なクエリベクトルが提供された場合、候補 Slice は通常どおり選択されます。フルクエリフォールバックは、シャードリクエスト、集約、およびオブジェクトストレージ読み取りのオーバーヘッドを増加させます。
真にフルクエリを必要とする専用タスクは、各リクエストでスコープを明示的に指定する必要があります。フルクエリを保証するためにこのグローバルスイッチに依存しないでください。このクラスター全体のスイッチは、アプリケーションが明示的にフルクエリフォールバックに依存しており、管理者が影響を受けるすべてのコレクションの負荷を評価し、同時実行数とタイムアウトの制御が実施されている場合にのみ有効にしてください:
PUT /_cluster/settings
{
"persistent": {
"apack.slice_collection.search.default_to_all_slices": true
}
}スイッチを有効にすると、名前空間モードでの GET /knowledge-chunks/_search は、_slice=_all を明示的に渡すことと等価になります。ベクトルクラスターモードでは、無効なパス、query_vector_builder、および不正なベクトル次元は引き続き拒否されます。詳細については、「候補 Slice の自動選択」をご参照ください。
この設定は、データを書き込まない上記のクエリエンドポイントにのみ適用されます。GET、MGet、Explain、インデックスの再作成、Update by query、または Delete by query には適用されません。
ルーティング互換性パラメーター
コレクションまたはコレクションエイリアスの場合、ドキュメントの書き込み、読み取り、およびクエリ API は、_slice の代わりに標準的な Elasticsearch の routing パラメーターを受け入れます。両方のパラメーターは同じ論理 Slice を表し、セマンティクス的に同等であるため、この互換性構文により、既存の Elasticsearch クライアントが引き続き機能します。新規アプリケーションでは、セマンティクスがより明確な_sliceを使用してください。以下の制約に注意してください:
同じ URL または同じ Bulk または MGet アイテムに
_sliceとroutingの両方を提供しないでください。
この互換性構文は、インデックスの再作成リクエストボディの
source.routing、コレクションおよび Slice 管理エンドポイント、キャッシュのプリウォーミング、Copy Slice、CAT、または明示的なリフレッシュには適用されません。
この互換性構文は、通常の Elasticsearch インデックスのルーティングセマンティクスを変更しません。
混合リクエストにおける通常のインデックス
Search タイプのリクエストに通常のインデックスとコレクションの両方が含まれる場合、クラスター設定 apack.slice_collection.rewrite.mixed_collection_targets が動作を決定します:
| 値 | Search タイプのリクエストの動作 |
ignore (デフォルト) | コレクションの再書き込みをスキップし、警告を返します。リクエストが _slice なしで既存の通常のインデックスとコレクションを明示的に指定した場合、通常のインデックスのみがクエリされます。リクエストに _slice が含まれている場合、Slice が有効になっていない通常のインデックスがあると、リクエストはメッセージ [_slice] is not allowed when [index.slice.enabled] is false とともに HTTP 400 を返します。 |
reject | 混合リクエストを拒否し、HTTP 400 を返します。 |
expand | 拡張をサポートする操作のために予約されています。Search タイプのリクエストは現在、混合拡張をサポートしていないため、この値では HTTP 400 を返します。 |
この場合、routing は依然として通常のインデックスのルーティングルールによって処理され、コレクション内の Slice を表しません。混合リクエスト内のすべての名前が存在し、リクエストが成功したとしても、結果にコレクションデータが含まれていると想定しないでください。
コレクションとリモートターゲットの両方を含むリクエストも、混合リクエストとして扱われます。インスタンスにコレクションが含まれている場合、インデックスなしの GET /_search にも前述のルールが適用されます。デフォルトでは、この設定は論理的なコレクションエントリポイントの再書き込みのみをスキップします。フルまたは広すぎるワイルドカードクエリは、依然として可視の Backing に直接一致する可能性があり、そのようなクエリはコレクションと Slice によってスコープされたクエリの代わりにはなりません。
両方のタイプのデータを読み取るには、別々のリクエストを送信し、アプリケーションで結果をマージしてください。