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

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

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

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

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

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

制限事項​

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

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

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

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

概要​

展開

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
同じコレクション内でエンティティごとに異なる有効期間が必要(per-tenant, hot/cold, per-document)エンティティレベル 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 します。これが、同じロードセッション内で期限切れの行へのアクセスを復元する唯一の方法です。

よくある質問​

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

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

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

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

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

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

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