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

コレクション TTL を設定する

Zilliz Cloud では、Time-to-Live(TTL) ポリシーを使用してエンティティを自動的に期限切れにできます。期限切れのエンティティはクエリおよび検索結果に直ちに表示されなくなり、次回の Compaction サイクルでストレージから物理的に削除されます。通常、これは 24 時間以内に実行されます。

TTL には 2つのモードがあります。

  • コレクションレベル TTL — すべてのエンティティで共有される 1つの保持期間です。collection.ttl.seconds プロパティで設定します。

  • エンティティレベル TTL — 各エンティティは、専用の TIMESTAMPTZ フィールドに独自の絶対有効期限を持ち、ttl_field プロパティによって TTL フィールドとしてマークされます。

📘Notes

この機能はマネージドコレクションにのみ適用されます。

制限事項​

  • 2つの TTL モードは相互に排他的です。コレクションで collection.ttl.seconds と ttl_field を同時に設定することはできません。切り替えるには、2つのモード間の移行 を参照してください。

  • コレクションレベル TTL は、コレクション全体に 1つの保持期間を適用します。単一の行に異なる有効期間が必要な場合は、エンティティレベル TTL を使用します。

  • エンティティレベル TTL のフィールドは TIMESTAMPTZ である必要があります。他の型は拒否されます。

  • TTL フィールドはコレクションごとに 1つです。スキーマには複数の TIMESTAMPTZ フィールドを含めることができますが、ttl_field に指定できるのは 1つだけです。

  • ttl_field を削除しても、期限切れのエンティティが再び表示されることはありません。期限切れのエンティティを復元するには、NULL または将来の有効期限タイムスタンプを使用してアップサートします。

概要​

展開

TTL を使用する状況​

保持が ポリシー である場合、TTL は適切なツールです。特定のエンティティが最終的に削除されるべきであることを事前に把握しており、cron ジョブを記述せずにクラスターでそれを適用したい場合に使用します。

一般的なシナリオ:

  • 時間枠付きデータセット。 ログ、メトリクス、イベント、または短命な特徴量キャッシュの直近 N 日分のみを保持します。

  • マルチテナントコレクション。 同じコレクション内で、テナントごとに異なる保持期間を設定します。

  • レコードごとの保持ポリシー。 IoT パイプライン、ドキュメントストア、または MLOps 特徴量ストアで、ドキュメントごとの有効期間を設定します。

  • ホットデータとコールドデータの混在。 短命なエンティティと長期間保持するエンティティが同じコレクション内に共存します。

  • コンプライアンスに基づく期限切れ。 各レコードが独自の「削除期限」を持つ、GDPR 形式のデータ最小化です。

  • ビジネス上の時刻に基づく期限切れ。 エンティティは、特定の絶対時点(キャンペーンの終了、セッションの期限切れなど)までのみ有効なレコードを表します。

📘Notes

期限切れのエンティティは、検索結果にもクエリ結果にも表示されません。ただし、次回のデータ Compaction が実行されるまでストレージに残る場合があります。この Compaction は通常 24 時間以内に実行されます。

TTL モード​

2つのモードは、異なる保持に関する問いに答えます。

  • コレクションレベル TTL は、すべてのエンティティに単一の保持期間を適用します。各エンティティは insert_ts + ttl_seconds に期限切れになります。

  • エンティティレベル TTL では、各エンティティが独自の絶対有効期限を TIMESTAMPTZ フィールドに保存できます。このフィールドが NULL の場合、エンティティは期限切れになりません。

コレクションは一度に 1つ のモードを使用します。2つのモードは相互に排他的です。切り替えは複数ステップの操作です。詳細は、2つのモード間の移行を参照してください。

モードを選択するには、次の表を使用します:

状況

使用するモード

コレクション内のすべてのエンティティが同じ保持期間に従う必要がある

コレクションレベル TTL

保持期間が「挿入時点から N 秒間保持する」である

コレクションレベル TTL

同じコレクション内でエンティティごとに異なる有効期間が必要である(テナント別、hot/cold, ドキュメント別)

エンティティレベル TTL

保持期限が絶対的な実時間である(例: 2027-01-01T00:00:00Z)

エンティティレベル TTL

保持期限が挿入タイムスタンプではなくビジネス上のタイムスタンプによって決まる

エンティティレベル TTL

挿入後にエンティティの有効期間を更新または延長したい

エンティティレベル TTL

期限切れにしないエンティティと期限切れにするエンティティが混在する

エンティティレベル TTL(期限切れにしないエンティティには NULL を使用)

コレクションレベル TTL を設定する​

コレクション内のすべてのエンティティが同じ保持期間に従う必要がある場合は、コレクションレベル TTL を使用します。

新しいコレクションで有効にする​

作成時に、properties マップを介して collection.ttl.seconds(整数、秒単位)を渡します。

python
from pymilvus import MilvusClient, DataType

client = MilvusClient(uri="YOUR_CLUSTER_ENDPOINT", token="YOUR_CLUSTER_TOKEN")

schema = client.create_schema(auto_id=False, enable_dynamic_field=False)
schema.add_field("id", DataType.INT64, is_primary=True, auto_id=False)
schema.add_field("vector", DataType.FLOAT_VECTOR, dim=128)

index_params = client.prepare_index_params()
index_params.add_index(
field_name="vector", index_type="AUTOINDEX", metric_type="COSINE"
)

client.create_collection(
collection_name="my_collection",
schema=schema,
index_params=index_params,
properties={
"collection.ttl.seconds": 1209600 # 14 days
},
)

既存のコレクションで有効にする​

すでに使用中のコレクションに TTL を適用するには、properties マップ内の collection.ttl.seconds を指定して alter_collection_properties を呼び出します。

python
from pymilvus import MilvusClient, DataType

client = MilvusClient(uri="YOUR_CLUSTER_ENDPOINT", token="YOUR_CLUSTER_TOKEN")

# Assumes "my_collection" was created earlier without TTL
schema = client.create_schema(auto_id=False, enable_dynamic_field=False)
schema.add_field("id", DataType.INT64, is_primary=True, auto_id=False)
schema.add_field("vector", DataType.FLOAT_VECTOR, dim=128)

index_params = client.prepare_index_params()
index_params.add_index(
field_name="vector", index_type="AUTOINDEX", metric_type="COSINE"
)

if not client.has_collection("my_collection"):
client.create_collection(
collection_name="my_collection",
schema=schema,
index_params=index_params,
)

client.alter_collection_properties(
collection_name="my_collection",
properties={"collection.ttl.seconds": 1209600},
)

TTL 設定を削除する​

コレクション内のデータを無期限に保持することにした場合は、そのコレクションから TTL 設定を削除するだけです。

python
from pymilvus import MilvusClient

client = MilvusClient(uri="YOUR_CLUSTER_ENDPOINT", token="YOUR_CLUSTER_TOKEN")

client.drop_collection_properties(
collection_name="my_collection",
property_keys=["collection.ttl.seconds"],
)

エンティティレベル TTL を設定する​

Public Preview

エンティティレベル TTL では、各エンティティが独自の絶対有効期限を持ちます。時刻はスキーマで宣言する専用の TIMESTAMPTZ 列に保存され、ttl_field コレクションプロパティを通じてその列を TTL フィールドとしてマークします。

新しいコレクションで有効にする​

作成時にエンティティレベル TTL を有効にするには、同じ create_collection 呼び出しに 2つの追加が必要です。スキーマ内の TIMESTAMPTZ フィールドと、そのフィールドを指す ttl_field プロパティです。

python
from pymilvus import MilvusClient, DataType

client = MilvusClient(uri="YOUR_CLUSTER_ENDPOINT", token="YOUR_CLUSTER_TOKEN")

schema = client.create_schema(enable_dynamic_field=False)
schema.add_field("id", DataType.INT64, is_primary=True, auto_id=False)
schema.add_field("expire_at", DataType.TIMESTAMPTZ, nullable=True)
schema.add_field("vector", DataType.FLOAT_VECTOR, dim=128)

index_params = client.prepare_index_params()
index_params.add_index(field_name="vector", index_type="AUTOINDEX",
metric_type="COSINE")

client.create_collection(
collection_name="my_collection",
schema=schema,
index_params=index_params,
properties={"ttl_field": "expire_at"},
)

コレクションが作成されたら、ISO 8601 のタイムスタンプ文字列を使用してエンティティを挿入します。

python
import random
from pymilvus import MilvusClient

client = MilvusClient(uri="YOUR_CLUSTER_ENDPOINT", token="YOUR_CLUSTER_TOKEN")

# Assumes "my_collection" was created earlier with `ttl_field`: "expire_at"
rows = [
# Never expires
{"id": 1, "expire_at": None,
"vector": [random.random() for _ in range(128)]},
# Expires at 2026-12-31 UTC midnight
{"id": 2, "expire_at": "2026-12-31T00:00:00Z",
"vector": [random.random() for _ in range(128)]},
# Shanghai local time — normalized to UTC internally
{"id": 3, "expire_at": "2027-01-01T00:00:00+08:00",
"vector": [random.random() for _ in range(128)]},
]

client.insert("my_collection", rows)

各クエリとベクトル検索では、サーバーが TTL フィルターを自動的に挿入します。このフィルターを自分で記述する必要はなく、期限切れのエンティティが結果に表示されることもありません:

python
from pymilvus import MilvusClient

client = MilvusClient(uri="YOUR_CLUSTER_ENDPOINT", token="YOUR_CLUSTER_TOKEN")

client.load_collection("my_collection")

# Expired rows are filtered out automatically
results = client.query(
collection_name="my_collection",
filter="id >= 0",
output_fields=["id", "expire_at"],
limit=10,
)
print(results)

同じ自動フィルターは client.search() にも適用されます。

Compaction によってエンティティが物理的に削除される前に有効期間を延長するには、より遅い有効期限タイムスタンプ(または None)を使用してアップサートし、エンティティをクエリ可能なセットに戻します。

python
import random
from pymilvus import MilvusClient

client = MilvusClient(uri="YOUR_CLUSTER_ENDPOINT", token="YOUR_CLUSTER_TOKEN")

client.upsert("my_collection", [
{"id": 2,
"vector": [random.random() for _ in range(128)],
"expire_at": "2028-01-01T00:00:00Z"},
])

既存のコレクションで有効にする​

コレクションがすでに存在し、collection.ttl.seconds が設定されていない場合は、add_collection_field で TIMESTAMPTZ 列を追加し、alter_collection_properties でその列を TTL フィールドとしてマークします。必要に応じて、履歴行をアップサートして有効期限タイムスタンプをバックフィルします。バックフィルしない行は NULL のままとなり、期限切れになりません。

python
import random
from pymilvus import MilvusClient, DataType

client = MilvusClient(uri="YOUR_CLUSTER_ENDPOINT", token="YOUR_CLUSTER_TOKEN")

# Step 1 — add a TIMESTAMPTZ column to the schema
client.add_collection_field(
collection_name="my_collection",
field_name="expire_at",
data_type=DataType.TIMESTAMPTZ,
nullable=True,
)

# Step 2 — mark the new column as the TTL field
client.alter_collection_properties(
collection_name="my_collection",
properties={"ttl_field": "expire_at"},
)

# Step 3 (optional) — backfill expiration timestamps for historical rows
client.upsert("my_collection", [
{"id": 1,
"vector": [random.random() for _ in range(128)],
"expire_at": "2026-12-31T00:00:00Z"},
])

TTL 設定を削除する​

エンティティごとの期限切れを停止するには、property_keys 内の ttl_field を指定して drop_collection_properties を呼び出します。TIMESTAMPTZ 列自体はスキーマに残ります。通常のフィールドとして引き続きクエリできます。

python
from pymilvus import MilvusClient

client = MilvusClient(uri="YOUR_CLUSTER_ENDPOINT", token="YOUR_CLUSTER_TOKEN")

client.drop_collection_properties(
collection_name="my_collection",
property_keys=["ttl_field"],
)

ttl_field を削除すると、今後のクエリに対する自動フィルターが無効になりますが、すでに期限切れになったエンティティが自動的に再び表示されることはありません。以前に期限切れになったエンティティを表示するには、None または将来の有効期限タイムスタンプを使用してアップサートします。これが、同じロードセッション内で期限切れの行へのアクセスを復元する唯一の方法です。

2つのモード間の移行​

2つの TTL モードは相互に排他的であるため、それらの間の切り替えは複数ステップの操作です。

コレクションレベルからエンティティレベル TTL に切り替える​

コレクションが collection.ttl.seconds を指定して作成されており、エンティティ単位の期限切れに切り替える場合は、以下の手順に従ってください。ステップ 1 を省略すると、ステップ 3 が collection TTL is already set, cannot be set ttl field で失敗します。

python
import random
from pymilvus import MilvusClient, DataType

client = MilvusClient(
uri="YOUR_CLUSTER_ENDPOINT",
token="YOUR_CLUSTER_TOKEN"
)

# Assumes "my_collection" already exists with `collection.ttl.seconds` set.
# Step 1 — disable collection-level TTL (mandatory; the two modes are mutually exclusive)
client.drop_collection_properties(
collection_name="my_collection",
property_keys=["collection.ttl.seconds"],
)

# Step 2 — add a TIMESTAMPTZ column to the schema
client.add_collection_field(
collection_name="my_collection",
field_name="expire_at",
data_type=DataType.TIMESTAMPTZ,
nullable=True,
)

# Step 3 — set the ttl_field property on the column you just added
client.alter_collection_properties(
collection_name="my_collection",
properties={"ttl_field": "expire_at"},
)

# Step 4 (optional) — backfill expiration timestamps for historical entities
client.upsert("my_collection", [
{"id": 1,
"vector": [random.random() for _ in range(128)],
"expire_at": "2026-12-31T00:00:00Z"},
])

expire_at をバックフィルしない履歴エンティティでは、その列が NULL となり、期限切れにならないことを意味します。有限の有効期間を持つべき行のみをバックフィルしてください。

エンティティレベルからコレクションレベル TTL に切り替える​

逆方向に移行するには、ttl_field を削除し、collection.ttl.seconds を設定します:

python
from pymilvus import MilvusClient

client = MilvusClient(
uri="YOUR_CLUSTER_ENDPOINT",
token="YOUR_CLUSTER_TOKEN"
)

# Assumes "my_collection" already exists with `ttl_field` set.
client.drop_collection_properties(
collection_name="my_collection",
property_keys=["ttl_field"],
)
client.alter_collection_properties(
collection_name="my_collection",
properties={"collection.ttl.seconds": 1209600}, # 14 days
)

FAQ​

TTL 設定によりデータはいつ期限切れになりますか?​

データは、挿入またはアップサートされた時点に基づいて期限切れになります。期限切れのデータは検索結果に表示されません。詳細は、例 を参照してください。

期限切れのデータはいつ物理的に削除されますか?​

データは期限切れになると、検索結果に含まれなくなります。ただし、クラスターの Compaction ポリシーに従い、次回のシステム Compaction が実行された後にのみ物理的に削除されます。

データの期限切れ直後に削除する必要がある場合は、お問い合わせ ください。

CU 容量はいつ減少しますか?​

クラスターの CU 容量は、メモリ使用量とストレージ使用量のうち大きい方です。ストレージ使用量が適用される場合、期限切れのデータが物理的に削除された後、Zilliz Cloud コンソールで CU 容量の減少を確認できます。