メインコンテンツまでスキップ

外部コレクションを作成する

Public Preview

外部コレクションは、Zilliz Cloud におけるデータコレクションの一種で、AWS S3 や Iceberg などの外部ストレージシステムまたはデータベーステーブルのデータに、Zilliz Cloud にコピーすることなくアクセスします。Zilliz Cloud のクエリインターフェイスとの互換性を維持しながら、データレイク上のクエリレイヤーとして機能します。

Notes

外部コレクションは、オンデマンドコンピューティング用データベースでのみ作成できます。サービング用の Dedicated クラスターでの外部コレクションの作成は、近日提供予定です。

概要​

一般的な AI データパイプラインでは、ユーザーがすでに AWS S3 などのストレージシステムに Parquet 形式などのデータを保存している場合があります。Zilliz Cloud でこの外部保存データを使用するには、通常、Extract-Transform-Load(ETL)パイプラインを使用してデータを Zilliz Cloud 自体のストレージにインポートする必要があります。

このようにデータを Zilliz Cloud に持ち込むワークフローでは、同期が困難な冗長データが作成され、データ整合性を確保するためのエンジニアリング保守の負担が増加します。

YQXWwPQ3vheYa4b8398cWoPNnyN

こうした問題を解決するために、Zilliz Cloud は外部コレクションを提供しています。外部コレクションを使用すると、データ同期や ETL パイプラインを気にすることなく、Zilliz Cloud から外部に保存されたデータにアクセスできます。

Q6F4wtcd2h3PnKbnMxncw3urn3f

作成後、外部コレクションはデータに直接アクセスし、データを保存している同じ場所にそのまま保持できます。バックグラウンドでは、Zilliz Cloud がマニフェストファイルを作成して、Zilliz Cloud のメタデータと外部データファイルの行との間のマッピングを記録します。マニフェストファイルの準備ができたら、マネージドコレクションの場合と同様に、外部コレクションにインデックスを作成できます。

データが変更された場合は、手動で 1 秒未満のリフレッシュをトリガーするとメタデータが更新され、Zilliz Cloud は常に最新の状態に保たれます。

外部コレクションは、オンデマンドコンピューティング用のデータベースで使用できます。

ステップ 1:スキーマを作成する​

マネージドコレクションを作成する場合と同様に、外部コレクションを作成する前にもスキーマを作成する必要があります。ただし、スキーマはマネージドコレクションのスキーマとは多少異なります。

事前準備​

  • 十分な権限を持つ API キー を取得していること 。ユーザー名:パスワード形式のトークンは受け付けられません。

    詳細は、API キー を参照してください。

  • データファイルソース(parquet、iceberg-table、lance-table、vortex)の場合は、オブジェクトストレージバケットを統合し、対象のデータファイルを含む外部ボリュームを作成していること。

    詳細は、AWS、GCP、Azure のドキュメントを参照してください。

    詳細は、外部ボリューム を参照してください。

サポートされるデータソース​

Zilliz Cloud は以下のデータソースをサポートしています。選択した形式で、対応する外部ソースを指定する必要があります。

  • parquet

    external_source には、対象の Parquet ファイルを含むフォルダーを設定します。

  • vortex,

    external_source には、バージョン 0.56 の Vortex 列指向ファイルを含むフォルダーを設定します。

  • lance-table

    external_source には、_transactions、_versions、data などのサブフォルダーを含むフォルダーパスを設定します。

  • iceberg-table

    external_source には、Iceberg テーブルの metadata.json ファイルを設定し、次のようにスナップショット ID を渡します。

    python
    external_spec={
    "format": "iceberg-table",
    "snapshot_id": "473984310232959286"
    }

スキーマを設定する​

対象のデータファイルを含む外部ボリュームを用意したら、コレクションの列を Parquet ファイル(parquet)、Lance テーブル(lance-table)、Iceberg テーブル(iceberg-table)、または 0.56.0 形式の Vortex ファイル(vortex)にマッピングするスキーマを作成します。

Notes

外部ソースは、フォルダーであることを示すために、フォワードスラッシュ (/) で終わる必要があります。

python
schema = MilvusClient.create_schema(
external_source='volume://my_volume/path/to/a/folder/',
external_spec='{"format": "parquet"}'
)

ステップ 2:フィールドを追加する​

スキーマの準備ができたら、次のようにフィールドを追加できます。

python
schema.add_field(
field_name="product_id",
datatype=DataType.INT64,
# highlight-next
external_field="id" # field name in the external data file
)
schema.add_field(
field_name="product_name",
datatype=DataType.VARCHAR,
max_length=512,
# highlight-next
external_field="name"
)
schema.add_field(
field_name="embedding",
datatype=DataType.FLOAT_VECTOR,
dim=768,
# highlight-next
external_field="vector"
)

ステップ 3:コレクションを作成する​

スキーマにすべてのフィールドを追加したら、外部コレクションを作成できます。

Notes

外部コレクションは、通常はオンデマンドクラスターに関連付けられたプロジェクトレベルのデータベースで作成できます。

python
from pymilvus import MilvusClient, DataType
import time

# connect the database
client = MilvusClient(
uri="https://{project-id}.{region}.vectordb.zillizcloud.com",
token="YOUR_API_KEY"
)

client.use_database(
db_name="my_database"
)
# create the collection
client.create_collection(
collection_name="test_collection",
schema=schema
)

ステップ 4:インデックスを作成する​

マネージドコレクションの場合と同様に、外部コレクションの列にインデックスを作成できます。

python
index_params = client.prepare_index_params()
# Add indexes
index_params.add_index(
field_name="embedding",
index_type="AUTOINDEX",
metric_type="COSINE"
)
index_params.add_index(
field_name="product_name",
index_type="AUTOINDEX"
)
client.create_index(
db_name="my_database",
collection_name="test_collection",
index_params=index_params
)

ステップ 5:データをリフレッシュする​

コレクションの準備ができたら、データのメタデータとインデックスを作成するためにリフレッシュします。

python
job_id = client.refresh_external_collection(
db_name="my_database",
collection_name="test_collection"
)
while True:
progress = client.get_refresh_external_collection_progress(job_id=job_id)
print(f" {progress.state}: {progress.progress}%")
if progress.state == "RefreshCompleted":
elapsed = progress.end_time - progress.start_time
print(f" Completed in {elapsed}ms")
break
elif progress.state == "RefreshFailed":
print(f" Failed: {progress.reason}")
break
time.sleep(2)

リフレッシュ操作は非同期であるため、その進捗を監視する反復処理を設定する必要があります。

RESTful API を使用する場合は、Describe External コレクション Refresh Job でリフレッシュジョブの進捗を確認するか、List External Collection Refresh Jobs でリフレッシュジョブを一覧表示します。

Notes
  • リフレッシュ操作では、データファイルのメタデータをスキャンし、それに応じてマニフェストファイルを生成します。通常、150-250 ms かかります。

  • マニフェストファイルには、Milvus のメタデータと外部ファイルの行との間のマッピングが記録されます。

  • ソースデータが更新された場合は、Zilliz Cloud を最新の状態に保つために、手動で再度リフレッシュを呼び出す必要があります。

  • 挿入を伴わずにすべてのアクティブなメタデータを削除する必要があるリフレッシュは、拒否されます。

  • オンデマンドコンピューティング用データベースの外部コレクションは、手動でロードおよびリリースする必要はありません。

次のステップ​

外部コレクションをリフレッシュしたら、マネージドコレクションの場合と同様に、外部コレクションで類似性検索とクエリを実行できます。ただし、オンデマンドコンピューティング用データベースのコレクションは、検索とクエリのためにオンデマンドクラスターに関連付ける必要があります。詳細は、オンデマンドクラスターを作成する および関連ページを参照してください。

検索、クエリ、get、ハイブリッド検索などの DQL 操作を実行する前に、オンデマンドクラスターのコンピューティングリソースを関連付けるセッションを作成する必要があります。詳細は、オンデマンド DQL 操作 を参照してください。

スナップショットをソースとして使用

スナップショットのメタデータ JSON パスを `externalsource` として使用し、`externalspec.format` を `"milvus-table"` に設定すると、Milvus スナップショットから外部コレクションを作成できます。 | Cloud