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

コレクション TTL の設定

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

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

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

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

Notes

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

制限​

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

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

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

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

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

概要​

展開

TTL を使用する場合​

保持が ポリシー である場合、TTL は適切なツールです。つまり、特定のエンティティがいずれ削除されることを事前に把握しており、cron ジョブを作成しなくてもクラスターにそれを強制したい場合です。

一般的なシナリオは次のとおりです。

  • 時間枠で区切られたデータセット。 ログ、メトリクス、イベント、または有効期間の短い特徴キャッシュの直近 N 日分のみを保持します。

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

  • レコード単位の保持ポリシー。 IoT パイプライン、ドキュメントストア、または MLOps 特徴ストアにおけるドキュメント単位の有効期間です。

  • ホットデータとコールドデータの混在。 同じコレクション内で、有効期間の短いエンティティと長期的なエンティティが共存します。

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

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

Notes

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

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")

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")

# 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")

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

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

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

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

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

python
from pymilvus import MilvusClient, DataType

client = MilvusClient(uri="YOUR_CLUSTER_ENDPOINT")

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")

# 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")

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 を指定して upsert し、エンティティをクエリ可能なセットに戻します。

python
import random
from pymilvus import MilvusClient

client = MilvusClient(uri="YOUR_CLUSTER_ENDPOINT")

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 フィールドとしてマークします。必要に応じて、履歴行を upsert して有効期限タイムスタンプをバックフィルします。バックフィルしない行は NULL のままになり、期限切れになることはありません。

python
import random
from pymilvus import MilvusClient, DataType

client = MilvusClient(uri="YOUR_CLUSTER_ENDPOINT")

# 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")

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

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

2 つのモード間の移行 | PRIVATE​

2 つの TTL モードは相互に排他的であるため、切り替えは複数の手順を伴う操作です。

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

コレクションが collection.ttl.seconds で作成されており、エンティティ単位の有効期限に切り替える場合は、次の 4 つの手順に従います。手順 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")

# 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 に切り替える​

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

python
from pymilvus import MilvusClient

client = MilvusClient(uri="YOUR_CLUSTER_ENDPOINT")

# 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 設定によってデータが期限切れになるのはいつですか?​

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

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

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

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

CU 容量が減少するのはいつですか?​

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