メインコンテンツまでスキップ
バージョン: User Guides (BYOC)

イテレータを使用したデータのエクスポート

このガイドでは、Zilliz Cloud のコレクションからデータをエクスポートする方法の例を示します。

概要

Milvus の Python SDK および Java SDK は、コレクション内のエンティティをメモリ効率の良い方法でイテレートするための一連のイテレータ API を提供しています。詳細については、Search Iterator を参照してください。

イテレータを使用することには、以下のような利点があります。

  • シンプルさ: 複雑な offset および limit の設定を不要にします。

  • 効率性: 必要なデータのみを取得することで、スケーラブルなデータ取得を実現します。

  • 一貫性: ブールフィルタを使用してもデータセットのサイズが一貫して保たれます。

これらの API を活用して、Zilliz Cloud コレクションから特定のエンティティまたはすべてのエンティティをエクスポートできます。

📘Notes

この機能は、Milvus 2.3.x 以降と互換性のある Zilliz Cloud クラスタで利用可能です。

準備

以下の手順では、Zilliz Cloud クラスタに接続し、コレクションを迅速にセットアップして、10,000 件以上のランダムに生成されたエンティティをコレクションに挿入するコードを再利用します。

ステップ 1: コレクションの作成

from pymilvus import MilvusClient

CLUSTER_ENDPOINT = "YOUR_CLUSTER_ENDPOINT"
TOKEN = "YOUR_CLUSTER_TOKEN"

# 1. Set up a Milvus client
client = MilvusClient(
uri=CLUSTER_ENDPOINT,
token=TOKEN
)

# 2. Create a collection
client.create_collection(
collection_name="quick_setup",
dimension=5,
)

ステップ 2: ランダムに生成されたエンティティを挿入する

# 3. Insert randomly generated vectors 
colors = ["green", "blue", "yellow", "red", "black", "white", "purple", "pink", "orange", "brown", "grey"]
data = []

for i in range(10000):
current_color = random.choice(colors)
current_tag = random.randint(1000, 9999)
data.append({
"id": i,
"vector": [ random.uniform(-1, 1) for _ in range(5) ],
"color": current_color,
"tag": current_tag,
"color_tag": f"{current_color}_{str(current_tag)}"
})

print(data[0])

# Output
#
# {
# "id": 0,
# "vector": [
# -0.5705990742218152,
# 0.39844925120642083,
# -0.8791287928610869,
# 0.024163154953680932,
# 0.6837669917169638
# ],
# "color": "purple",
# "tag": 7774,
# "color_tag": "purple_7774"
# }

res = client.insert(
collection_name="quick_setup",
data=data,
)

print(res)

# Output
#
# {
# "insert_count": 10000,
# "ids": [
# 0,
# 1,
# 2,
# 3,
# 4,
# 5,
# 6,
# 7,
# 8,
# 9,
# "(9990 more items hidden)"
# ]
# }

イテレータを使用したデータのエクスポート

イテレータを使用してデータをエクスポートするには、以下の手順に従います。

  1. 検索パラメータと出力フィールドを定義するために検索イテレータを初期化します。batch_size パラメータを設定することで、1回のイテレーションでエクスポートするエンティティの数を制限できます。

  2. ループ内で next() メソッドを使用して、検索結果をページネーションします。

    • このメソッドが空の配列を返す場合、ループは終了します。

    • それ以外の場合は、任意の方法で返されたデータを保存します。たとえば、ファイルに追記したり、データベースに保存したり、他のコンシューマープログラムに渡したりできます。

  3. すべてのデータを取得し終えたら、close() メソッドを呼び出してイテレータを閉じます。

以下のコードスニペットは、QueryIterator API を使用してエクスポートされたデータをファイルに追記する方法を示しています。

import json
from pymilvus import connections, Collection

CLUSTER_ENDPOINT = "YOUR_CLUSTER_ENDPOINT"
TOKEN = "YOUR_CLUSTER_TOKEN"

connections.connect(
uri=CLUSTER_ENDPOINT,
token=TOKEN
)

collection = Collection("quick_setup")

# 6. Query with iterator

# Initiate an empty JSON file
with open('results.json', 'w') as fp:
fp.write(json.dumps([]))

iterator = collection.query_iterator(
batch_size=10,
expr="color_tag like \"brown_8%\"",
output_fields=["color_tag"]
)

while True:
result = iterator.next()
if not result:
iterator.close()
break

# Read existing records and append the returns
with open('results.json', 'r') as fp:
results = json.loads(fp.read())
results += result

# Save the result set
with open('results.json', 'w') as fp:
fp.write(json.dumps(results))