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

外部データレイク検索のクイックスタート

外部データレイク検索を使用すると、コンピュートリソースを継続的に稼働させることなく、外部ストレージ内のデータまたは Zilliz Cloud にインポートしたデータにゼロコピーでアクセスし、大規模なデータセットを検索できます。外部ボリュームまたはインポートしたファイルからコレクションを作成し、プロジェクトのデータプレーンエンドポイント経由でインデックスを構築してメタデータを更新しながら、検索またはクエリのワークロードを実行する場合にのみオンデマンドクラスターを起動できます。

手順は以下の通りです。

事前準備​

  • ストレージ統合を作成する

    ストレージ統合は、アクセス認証情報と共にデータの場所を記録するプロファイルです。ストレージ統合を設定するには、手順に従って AWS S3、Google GCS、または Azure のストレージ統合を作成し、ストレージ統合 ID を取得してください。

  • 外部ボリュームを作成する

    外部ボリュームは、ストレージ統合内のパスです。未加工のデータがそのパスにあることを確認してください。同じストレージ統合から複数の外部ボリュームを作成できます。外部ボリュームの作成方法については、外部ボリューム を参照してください。

ステップ 1: プロジェクトエンドポイントに接続する​

データベースで作業する前に、プロジェクトエンドポイントに接続します。Zilliz Cloud コンソールでオンデマンドコンピュートを有効にすると、クイックスタートページでプロジェクトエンドポイントを取得できます。

Notes

外部コレクションの操作では、認証に API キーが必要です。このフローでは、username:password 認証はサポートされていません。

python
# connect to database
client = MilvusClient(
# a project-specific on-demand compute endpoint
uri="https://{project-id}.{region}.api.zillizcloud.com",
token="YOUR_API_KEY"
)

ステップ 2: データベースを作成する(任意)​

Zilliz Cloud にはデフォルトのデータベースが用意されています。デフォルトのデータベースを使用する場合は、このステップをスキップしてください。次のようにデータベースを作成することもできます。

python
client.create_database(
db_name="my_database"
)

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

データベースの準備ができたら、その中に外部コレクションを作成できます。外部コレクションは、その列を指定したデータファイルにマッピングし、そのコレクションでの検索用にオンデマンドコンピュートリソースをアタッチします。

未加工のデータをコレクションにインポートする必要があるマネージドコレクションとは異なり、外部コレクションは 1 秒未満の更新操作によって未加工のデータからメタデータを生成します。

次の例は、コレクションフィールドとデータファイルの間のマッピング関係を設定する方法を示しています。スキーマを作成するときは、ボリュームパスとデータ形式を指定します。このクイックスタートでは Iceberg テーブルを使用します。サポートされているデータソースと形式の完全な一覧については、サポートされているデータソースと形式 を参照してください。

python
from pymilvus import MilvusClient, DataType

schema = MilvusClient.create_schema(
external_source='volume://my_volume/iceberg/metadata/00001-xxx.metadata.json',
external_spec='{"format": "iceberg-table", "snapshot_id": "1234567890123456789"}'
)

schema.add_field(
field_name="vector",
datatype=DataType.FLOAT_VECTOR,
dim=1536,
# highlight-next
external_field="embedding" # field name in the external data file
)

schema.add_field(
field_name="product_id",
datatype=DataType.VARCHAR,
max_length=32,
nullable=True,
# highlight-next
external_field="product_id"
)

schema.add_field(
field_name="title",
datatype=DataType.VARCHAR,
max_length=512,
nullable=True,
# highlight-next
external_field="title"
)

schema.add_field(
field_name="main_category",
datatype=DataType.VARCHAR,
max_length=64,
nullable=True,
# highlight-next
external_field="main_category"
)

schema.add_field(
field_name="price",
datatype=DataType.DOUBLE,
nullable=True,
# highlight-next
external_field="price"
)

schema.add_field(
field_name="average_rating",
datatype=DataType.DOUBLE,
nullable=True,
# highlight-next
external_field="average_rating"
)

schema.add_field(
field_name="rating_number",
datatype=DataType.INT64,
nullable=True,
# highlight-next
external_field="rating_number"
)

その後、上記のスキーマを使用してコレクションを作成できます。デフォルトのデータベースを使用する場合は、db_name パラメーターを安全に省略できます。

python
client.use_database(
db_name="my_database"
)

# create the collection
client.create_collection(
collection_name="my_collection",
schema=schema
)

ステップ 4: インデックスを作成してコレクションを更新する​

外部データベースでは、マネージドコレクションの場合と同じようにインデックスを作成できます。すべてのベクトルフィールドにインデックスを作成する必要があり、高速なメタデータフィルタリングのために一部のスカラーフィールドを選択してインデックスを作成できます。ただし、インデックスを構築するには refresh を呼び出す必要があります。

python
index_params = client.prepare_index_params()

# Add indexes
index_params.add_index(
field_name="vector",
index_type="AUTOINDEX",
metric_type="COSINE"
)

index_params.add_index(
field_name="main_category",
index_type="AUTOINDEX"
)

client.create_index(
db_name="my_database",
collection_name="my_collection",
index_params=index_params
)

次に、外部コレクションを更新します。コレクションスキーマを再利用するには externalSource と externalSpec を省略できます。新しいソースからコレクションスキーマを更新するには、両方を指定します。

python
# refresh the external database
job_id = client.refresh_external_collection(
collection_name="my_collection"
)

その後、進捗監視の呼び出しをループでラップして、更新操作の進捗を追跡できます。

python
progress = client.get_refresh_external_collection_progress(job_id=job_id)

ステップ 5: オンデマンドクラスターを作成する​

外部コレクションの準備ができたら、オンデマンド検索用にオンデマンドクラスターにアタッチする必要があります。次のコマンドは、クラスターを作成してその ID を返します。

bash
export CONTROL_PLANE_ENDPOINT="https://api.cloud.zilliz.com"

curl --request POST \
--url "${CONTROL_PLANE_ENDPOINT}/v2/clusters/createOnDemandCluster" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d '{
"projectId": "proj-xxxxxxxxxxxxxxxxxxx",
"regionId": "aws-us-west-2",
"clusterName": "my-on-demand",
"cuSize": 8,
"autoSuspend": 60
}'

# inxx-xxxxxxxxxxxxx

デフォルトでは、クラスターは最後のリクエストから 60 秒後に自動的に一時停止します。ユースケースに合わせてこの値を設定できます。

ステップ 6: 検索を実行する​

検索、クエリ、またはハイブリッド検索を実行する必要がある場合は、前のステップで作成したオンデマンドクラスターにセッション経由で接続できます。

python
session = client.session(
cluster_id="inxx-xxxxxxxxxxxxx"
)

# 1536-dimensional vector
query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, ..., 0.9029438446296592]
res = session.search(
db_name="my_database",
collection_name="my_collection",
anns_field="vector",
data=[query_vector],
limit=3,
output_fields=["product_id", "title", "main_category", "price", "average_rating", "rating_number"]
)

その後、データを探索して最も価値のあるサブセットを見つけることができます。次に、サービングクラスターに接続し、データをインポートして本番環境で提供できます。