Tetapkan TTL Koleksi
Milvus dapat secara otomatis menghapus entitas melalui kebijakan Time-to-Live (TTL ). Entitas yang kedaluwarsa akan segera berhenti muncul di kueri dan hasil pencarian, dan secara fisik dihapus dari penyimpanan pada siklus pemadatan berikutnya - biasanya dalam waktu 24 jam.
Ada dua mode TTL:
TTL tingkat koleksi - satu jendela retensi yang digunakan bersama oleh setiap entitas, yang diatur melalui properti
collection.ttl.seconds.TTL tingkat entitas - setiap entitas memiliki waktu kedaluwarsa absolutnya sendiri di bidang khusus
TIMESTAMPTZ, yang ditandai sebagai bidang TTL melalui propertittl_field.
Fitur ini hanya berlaku untuk koleksi yang dikelola.
Batas
Kedua mode TTL tersebut saling eksklusif. Sebuah koleksi tidak dapat memiliki
collection.ttl.secondsdanttl_fieldyang diatur pada waktu yang sama. Untuk beralih, lihat Berpindah di antara dua mode.TTL tingkat koleksi menerapkan satu jendela ke seluruh koleksi. Jika satu baris membutuhkan masa berlaku yang berbeda, gunakan TTL tingkat entitas.
Bidang untuk TTL tingkat entitas harus
TIMESTAMPTZ. Jenis lain akan ditolak.Satu bidang TTL per koleksi. Skema dapat berisi beberapa bidang
TIMESTAMPTZ, tetapi hanya satu yang dapat diberi nama dittl_field.Menghapus
ttl_fieldtidak akan memunculkan kembali entitas yang sudah kedaluwarsa. Untuk memulihkan entitas yang kedaluwarsa, pasang kembali denganNULLatau stempel waktu kedaluwarsa yang akan datang.
Gambaran Umum
Kapan menggunakan TTL
TTL adalah alat yang tepat ketika retensi adalah kebijakan - Anda tahu sebelumnya bahwa entitas tertentu pada akhirnya akan hilang, dan Anda ingin cluster memberlakukannya tanpa Anda menulis pekerjaan cron.
Skenario umum:
Kumpulan data berjendela waktu. Hanya menyimpan log, metrik, peristiwa, atau cache fitur yang berumur pendek selama N hari terakhir.
Koleksi multi-penyewa. Penyewa yang berbeda memiliki jendela retensi yang berbeda dalam koleksi yang sama.
Kebijakan retensi per-rekaman. Masa pakai per-dokumen dalam pipeline IoT, penyimpanan dokumen, atau penyimpanan fitur MLOps.
Campuran data panas / dingin. Entitas berumur pendek berdampingan dengan entitas berumur panjang dalam koleksi yang sama.
Kedaluwarsa yang didorong oleh kepatuhan. Minimalisasi data gaya GDPR di mana setiap catatan memiliki tanggal "hapus pada" sendiri.
Kadaluarsa waktu bisnis. Entitas mewakili catatan yang hanya berlaku hingga suatu saat tertentu (kampanye berakhir, sesi berakhir).
Entitas yang kedaluwarsa tidak akan muncul di hasil pencarian atau kueri apa pun. Namun, entitas tersebut dapat tetap berada di penyimpanan hingga pemadatan data berikutnya, yang harus dilakukan dalam 24 jam ke depan.
Anda dapat mengontrol kapan waktu pemadatan data dengan mengatur item konfigurasi dataCoord.compaction.expiry.tolerance di file konfigurasi Milvus anda.
Item konfigurasi ini secara default bernilai -1, yang mengindikasikan bahwa interval pemadatan data yang ada berlaku. Namun, ketika Anda mengubah nilainya menjadi bilangan bulat positif, seperti 12, pemadatan data akan dipicu pada jumlah jam yang ditentukan setelah entitas apa pun menjadi kedaluwarsa.
Mode TTL
Kedua mode ini menjawab pertanyaan retensi yang berbeda:
TTL tingkat koleksi menerapkan durasi retensi tunggal untuk setiap entitas. Setiap entitas kedaluwarsa di
insert_ts + ttl_seconds.TTL tingkat entitas memungkinkan setiap entitas menyimpan waktu kedaluwarsa absolutnya sendiri di bidang
TIMESTAMPTZ. SebuahNULLdi bidang itu berarti entitas tidak pernah kedaluwarsa.
Sebuah koleksi menggunakan satu mode dalam satu waktu - keduanya tidak saling terpisah. Beralih di antara keduanya merupakan operasi multi-langkah; lihat Memindahkan di antara dua mode.
Gunakan tabel ini untuk memilih mode:
Jika situasi Anda adalah... |
Gunakan |
|---|---|
Setiap entitas dalam koleksi harus mengikuti jendela retensi yang sama |
TTL tingkat koleksi |
Retensi adalah "dari saat penyisipan, simpan N detik" |
TTL tingkat koleksi |
Entitas yang berbeda membutuhkan masa simpan yang berbeda dalam koleksi yang sama (per-penyewa, panas/dingin, per-dokumen) |
TTL tingkat entitas |
Retensi adalah waktu jam dinding absolut (misalnya, 2027-01-01T00:00:00Z) |
TTL tingkat entitas |
Retensi ditentukan oleh stempel waktu bisnis, bukan stempel waktu penyisipan |
TTL tingkat entitas |
Anda ingin menyegarkan atau memperpanjang masa hidup entitas setelah penyisipan |
TTL tingkat entitas |
Beberapa entitas tidak boleh kedaluwarsa, sementara entitas lainnya harus kedaluwarsa |
TTL tingkat entitas (gunakan NULL untuk entitas yang abadi) |
Tetapkan TTL tingkat koleksi
Gunakan TTL tingkat koleksi ketika setiap entitas dalam koleksi harus mengikuti jendela retensi yang sama.
Mengaktifkan pada koleksi baru
Lewati collection.ttl.seconds (bilangan bulat, dalam detik) melalui peta properties pada waktu pembuatan.
from pymilvus import MilvusClient, DataType
client = MilvusClient(uri="http://localhost:19530")
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
},
)
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.common.DataType;
import io.milvus.v2.common.IndexParam;
import io.milvus.v2.service.collection.request.AddFieldReq;
import io.milvus.v2.service.collection.request.CreateCollectionReq;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("http://localhost:19530")
.build());
CreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder().build();
schema.addField(AddFieldReq.builder().fieldName("id").dataType(DataType.Int64)
.isPrimaryKey(true).autoID(false).build());
schema.addField(AddFieldReq.builder().fieldName("vector").dataType(DataType.FloatVector)
.dimension(128).build());
IndexParam indexParam = IndexParam.builder().fieldName("vector")
.indexType(IndexParam.IndexType.AUTOINDEX)
.metricType(IndexParam.MetricType.COSINE).build();
Map<String, String> properties = new HashMap<>();
properties.put("collection.ttl.seconds", "1209600"); // 14 days
client.createCollection(CreateCollectionReq.builder()
.collectionName("my_collection")
.collectionSchema(schema)
.indexParams(Collections.singletonList(indexParam))
.properties(properties)
.build());
const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node");
const client = new MilvusClient({ address: "http://localhost:19530" });
await client.createCollection({
collection_name: "my_collection",
fields: [
{ name: "id", data_type: DataType.Int64, is_primary_key: true, autoID: false },
{ name: "vector", data_type: DataType.FloatVector, dim: 128 },
],
index_params: [
{ field_name: "vector", index_type: "AUTOINDEX", metric_type: "COSINE" },
],
properties: {
"collection.ttl.seconds": 1209600, // 14 days
},
});
err = client.CreateCollection(ctx, milvusclient.NewCreateCollectionOption("my_collection", schema).
WithProperty(common.CollectionTTLConfigKey, 1209600)) // TTL in seconds
if err != nil {
fmt.Println(err.Error())
// handle error
}
export params='{
"ttlSeconds": 1209600
}'
export CLUSTER_ENDPOINT="http://localhost:19530"
export TOKEN="root:Milvus"
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d "{
\"collectionName\": \"my_collection\",
\"schema\": $schema,
\"params\": $params
}"
Mengaktifkan pada koleksi yang sudah ada
Panggil alter_collection_properties dengan collection.ttl.seconds di dalam peta properties untuk menerapkan TTL pada koleksi yang sudah digunakan.
from pymilvus import MilvusClient, DataType
client = MilvusClient(uri="http://localhost:19530")
# 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},
)
import java.util.HashMap;
import java.util.Map;
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.collection.request.AlterCollectionPropertiesReq;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("http://localhost:19530")
.build());
// Assumes "my_collection" was created earlier without TTL.
Map<String, String> properties = new HashMap<>();
properties.put("collection.ttl.seconds", "1209600");
client.alterCollectionProperties(AlterCollectionPropertiesReq.builder()
.collectionName("my_collection")
.properties(properties)
.build());
const { MilvusClient } = require("@zilliz/milvus2-sdk-node");
const client = new MilvusClient({ address: "http://localhost:19530" });
// Assumes "my_collection" was created earlier without TTL.
await client.alterCollectionProperties({
collection_name: "my_collection",
properties: { "collection.ttl.seconds": 1209600 },
});
err = client.AlterCollectionProperties(ctx, milvusclient.NewAlterCollectionPropertiesOption("my_collection").
WithProperty(common.CollectionTTLConfigKey, 60))
if err != nil {
fmt.Println(err.Error())
// handle error
}
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/alter_properties" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d "{
\"collectionName\": \"my_collection\",
\"properties\": {
\"collection.ttl.seconds\": 1209600
}
}"
Menghilangkan pengaturan TTL
Jika Anda memutuskan untuk menyimpan data dalam sebuah koleksi tanpa batas waktu, Anda dapat dengan mudah menghapus pengaturan TTL dari koleksi tersebut.
from pymilvus import MilvusClient
client = MilvusClient(uri="http://localhost:19530")
client.drop_collection_properties(
collection_name="my_collection",
property_keys=["collection.ttl.seconds"],
)
import java.util.Collections;
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.collection.request.DropCollectionPropertiesReq;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("http://localhost:19530")
.build());
client.dropCollectionProperties(DropCollectionPropertiesReq.builder()
.collectionName("my_collection")
.propertyKeys(Collections.singletonList("collection.ttl.seconds"))
.build());
const { MilvusClient } = require("@zilliz/milvus2-sdk-node");
const client = new MilvusClient({ address: "http://localhost:19530" });
await client.dropCollectionProperties({
collection_name: "my_collection",
properties: ["collection.ttl.seconds"],
});
err = client.DropCollectionProperties(ctx, milvusclient.NewDropCollectionPropertiesOption("my_collection", common.CollectionTTLConfigKey))
if err != nil {
fmt.Println(err.Error())
// handle error
}
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/drop_properties" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d "{
\"collectionName\": \"my_collection\",
\"propertyKeys\": [
\"collection.ttl.seconds\"
]
}"
Mengatur TTL tingkat entitasCompatible with Milvus 3.0.x
TTL tingkat entitas memungkinkan setiap entitas memiliki waktu kedaluwarsa absolutnya sendiri. Waktu tersebut disimpan dalam kolom TIMESTAMPTZ khusus yang Anda deklarasikan di dalam skema, dan Anda menandai kolom tersebut sebagai bidang TTL melalui properti koleksi ttl_field.
Mengaktifkan pada koleksi baru
Mengaktifkan TTL tingkat entitas pada waktu pembuatan membutuhkan dua tambahan dalam pemanggilan create_collection yang sama: kolom TIMESTAMPTZ dalam skema, dan properti ttl_field yang menunjuk ke kolom tersebut.
from pymilvus import MilvusClient, DataType
client = MilvusClient(uri="http://localhost:19530")
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"},
)
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.common.DataType;
import io.milvus.v2.common.IndexParam;
import io.milvus.v2.service.collection.request.AddFieldReq;
import io.milvus.v2.service.collection.request.CreateCollectionReq;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("http://localhost:19530")
.build());
CreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder().build();
schema.addField(AddFieldReq.builder().fieldName("id").dataType(DataType.Int64)
.isPrimaryKey(true).autoID(false).build());
schema.addField(AddFieldReq.builder().fieldName("expire_at").dataType(DataType.Timestamptz)
.isNullable(true).build());
schema.addField(AddFieldReq.builder().fieldName("vector").dataType(DataType.FloatVector)
.dimension(128).build());
IndexParam indexParam = IndexParam.builder().fieldName("vector")
.indexType(IndexParam.IndexType.AUTOINDEX)
.metricType(IndexParam.MetricType.COSINE).build();
Map<String, String> properties = new HashMap<>();
properties.put("ttl_field", "expire_at");
client.createCollection(CreateCollectionReq.builder()
.collectionName("my_collection")
.collectionSchema(schema)
.indexParams(Collections.singletonList(indexParam))
.properties(properties)
.build());
const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node");
const client = new MilvusClient({ address: "http://localhost:19530" });
await client.createCollection({
collection_name: "my_collection",
fields: [
{ name: "id", data_type: DataType.Int64, is_primary_key: true, autoID: false },
{ name: "expire_at", data_type: DataType.Timestamptz, nullable: true },
{ name: "vector", data_type: DataType.FloatVector, dim: 128 },
],
index_params: [
{ field_name: "vector", index_type: "AUTOINDEX", metric_type: "COSINE" },
],
properties: { ttl_field: "expire_at" },
});
// go
# restful
Setelah koleksi ada, masukkan entitas dengan string stempel waktu ISO 8601.
import random
from pymilvus import MilvusClient
client = MilvusClient(uri="http://localhost:19530")
# 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)
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import com.google.gson.Gson;
import com.google.gson.JsonNull;
import com.google.gson.JsonObject;
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.vector.request.InsertReq;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("http://localhost:19530")
.build());
// Assumes "my_collection" was created earlier with `ttl_field`: "expire_at".
Gson gson = new Gson();
Random rng = new Random();
List<Float> vector = new ArrayList<>();
for (int i = 0; i < 128; i++) vector.add(rng.nextFloat());
List<JsonObject> rows = new ArrayList<>();
// Never expires
JsonObject r1 = new JsonObject();
r1.addProperty("id", 1);
r1.add("expire_at", JsonNull.INSTANCE);
r1.add("vector", gson.toJsonTree(vector));
rows.add(r1);
// Expires at 2026-12-31 UTC midnight
JsonObject r2 = new JsonObject();
r2.addProperty("id", 2);
r2.addProperty("expire_at", "2026-12-31T00:00:00Z");
r2.add("vector", gson.toJsonTree(vector));
rows.add(r2);
// Shanghai local time — normalized to UTC internally
JsonObject r3 = new JsonObject();
r3.addProperty("id", 3);
r3.addProperty("expire_at", "2027-01-01T00:00:00+08:00");
r3.add("vector", gson.toJsonTree(vector));
rows.add(r3);
client.insert(InsertReq.builder()
.collectionName("my_collection")
.data(rows)
.build());
const { MilvusClient } = require("@zilliz/milvus2-sdk-node");
const client = new MilvusClient({ address: "http://localhost:19530" });
const vector = Array.from({ length: 128 }, () => Math.random());
// Assumes "my_collection" was created earlier with `ttl_field`: "expire_at".
await client.insert({
collection_name: "my_collection",
data: [
// Never expires
{ id: 1, expire_at: null, vector },
// Expires at 2026-12-31 UTC midnight
{ id: 2, expire_at: "2026-12-31T00:00:00Z", vector },
// Shanghai local time — normalized to UTC internally
{ id: 3, expire_at: "2027-01-01T00:00:00+08:00", vector },
],
});
// go
# restful
Pada setiap kueri dan pencarian vektor, server secara otomatis menyuntikkan filter TTL - Anda tidak pernah menulisnya sendiri, dan entitas yang kedaluwarsa tidak akan muncul di hasil:
from pymilvus import MilvusClient
client = MilvusClient(uri="http://localhost:19530")
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)
import java.util.Arrays;
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.collection.request.LoadCollectionReq;
import io.milvus.v2.service.vector.request.QueryReq;
import io.milvus.v2.service.vector.response.QueryResp;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("http://localhost:19530")
.build());
client.loadCollection(LoadCollectionReq.builder()
.collectionName("my_collection")
.build());
// Expired rows are filtered out automatically
QueryResp results = client.query(QueryReq.builder()
.collectionName("my_collection")
.filter("id >= 0")
.outputFields(Arrays.asList("id", "expire_at"))
.limit(10L)
.build());
System.out.println(results.getQueryResults());
const { MilvusClient } = require("@zilliz/milvus2-sdk-node");
const client = new MilvusClient({ address: "http://localhost:19530" });
await client.loadCollection({ collection_name: "my_collection" });
// Expired rows are filtered out automatically
const results = await client.query({
collection_name: "my_collection",
filter: "id >= 0",
output_fields: ["id", "expire_at"],
limit: 10,
});
console.log(results.data);
// go
# restful
Filter otomatis yang sama juga berlaku untuk client.search().
Untuk memperpanjang masa pakai entitas sebelum pemadatan menghapusnya secara fisik, tambahkan dengan stempel waktu kedaluwarsa yang lebih baru - atau None - untuk mengembalikan entitas ke kumpulan yang dapat ditanyakan.
import random
from pymilvus import MilvusClient
client = MilvusClient(uri="http://localhost:19530")
client.upsert("my_collection", [
{"id": 2,
"vector": [random.random() for _ in range(128)],
"expire_at": "2028-01-01T00:00:00Z"},
])
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.vector.request.UpsertReq;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("http://localhost:19530")
.build());
Gson gson = new Gson();
Random rng = new Random();
List<Float> vector = new ArrayList<>();
for (int i = 0; i < 128; i++) vector.add(rng.nextFloat());
JsonObject row = new JsonObject();
row.addProperty("id", 2);
row.add("vector", gson.toJsonTree(vector));
row.addProperty("expire_at", "2028-01-01T00:00:00Z");
client.upsert(UpsertReq.builder()
.collectionName("my_collection")
.data(Collections.singletonList(row))
.build());
const { MilvusClient } = require("@zilliz/milvus2-sdk-node");
const client = new MilvusClient({ address: "http://localhost:19530" });
const vector = Array.from({ length: 128 }, () => Math.random());
await client.upsert({
collection_name: "my_collection",
data: [
{ id: 2, vector, expire_at: "2028-01-01T00:00:00Z" },
],
});
// go
# restful
Mengaktifkan koleksi yang sudah ada
Jika koleksi sudah ada dan tidak memiliki kumpulan collection.ttl.seconds, tambahkan kolom TIMESTAMPTZ dengan add_collection_field, lalu tandai sebagai bidang TTL dengan alter_collection_properties. Secara opsional, tambahkan baris historis untuk mengisi ulang stempel waktu kedaluwarsa mereka - baris yang tidak Anda isi ulang akan tetap menggunakan NULL dan tidak akan pernah kedaluwarsa.
import random
from pymilvus import MilvusClient, DataType
client = MilvusClient(uri="http://localhost:19530")
# 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"},
])
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.common.DataType;
import io.milvus.v2.service.collection.request.AddCollectionFieldReq;
import io.milvus.v2.service.collection.request.AlterCollectionPropertiesReq;
import io.milvus.v2.service.vector.request.UpsertReq;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("http://localhost:19530")
.build());
// Step 1 — add a TIMESTAMPTZ column to the schema
client.addCollectionField(AddCollectionFieldReq.builder()
.collectionName("my_collection")
.fieldName("expire_at")
.dataType(DataType.Timestamptz)
.isNullable(true)
.build());
// Step 2 — mark the new column as the TTL field
Map<String, String> properties = new HashMap<>();
properties.put("ttl_field", "expire_at");
client.alterCollectionProperties(AlterCollectionPropertiesReq.builder()
.collectionName("my_collection")
.properties(properties)
.build());
// Step 3 (optional) — backfill expiration timestamps for historical rows
Gson gson = new Gson();
Random rng = new Random();
List<Float> vector = new ArrayList<>();
for (int i = 0; i < 128; i++) vector.add(rng.nextFloat());
JsonObject row = new JsonObject();
row.addProperty("id", 1);
row.add("vector", gson.toJsonTree(vector));
row.addProperty("expire_at", "2026-12-31T00:00:00Z");
client.upsert(UpsertReq.builder()
.collectionName("my_collection")
.data(Collections.singletonList(row))
.build());
const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node");
const client = new MilvusClient({ address: "http://localhost:19530" });
const vector = Array.from({ length: 128 }, () => Math.random());
// Step 1 — add a TIMESTAMPTZ column to the schema
await client.addCollectionField({
collection_name: "my_collection",
field: { name: "expire_at", data_type: DataType.Timestamptz, nullable: true },
});
// Step 2 — mark the new column as the TTL field
await client.alterCollectionProperties({
collection_name: "my_collection",
properties: { ttl_field: "expire_at" },
});
// Step 3 (optional) — backfill expiration timestamps for historical rows
await client.upsert({
collection_name: "my_collection",
data: [
{ id: 1, vector, expire_at: "2026-12-31T00:00:00Z" },
],
});
// go
# restful
Hilangkan pengaturan TTL
Panggil drop_collection_properties dengan ttl_field di property_keys untuk menghentikan kedaluwarsa per-entitas. Kolom TIMESTAMPTZ sendiri tetap ada di skema - Anda masih dapat melakukan kueri sebagai kolom biasa.
from pymilvus import MilvusClient
client = MilvusClient(uri="http://localhost:19530")
client.drop_collection_properties(
collection_name="my_collection",
property_keys=["ttl_field"],
)
import java.util.Collections;
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.collection.request.DropCollectionPropertiesReq;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("http://localhost:19530")
.build());
client.dropCollectionProperties(DropCollectionPropertiesReq.builder()
.collectionName("my_collection")
.propertyKeys(Collections.singletonList("ttl_field"))
.build());
const { MilvusClient } = require("@zilliz/milvus2-sdk-node");
const client = new MilvusClient({ address: "http://localhost:19530" });
await client.dropCollectionProperties({
collection_name: "my_collection",
properties: ["ttl_field"],
});
// go
# restful
Menghapus ttl_field akan menonaktifkan filter otomatis untuk kueri di masa mendatang, tetapi entitas yang sudah kedaluwarsa tidak secara otomatis muncul lagi. Untuk membuat entitas yang sudah kedaluwarsa terlihat, tambahkan dengan None atau stempel waktu kedaluwarsa di masa mendatang - itulah satu-satunya cara untuk memulihkan akses ke baris yang sudah kedaluwarsa dalam sesi pemuatan yang sama.
Bermigrasi di antara dua mode
Dua mode TTL saling terpisah, jadi beralih di antara keduanya merupakan operasi multi-langkah.
Beralih dari TTL tingkat koleksi ke tingkat entitas
Jika koleksi Anda dibuat dengan collection.ttl.seconds dan Anda ingin beralih ke kedaluwarsa per entitas, ikuti empat langkah berikut. Melewatkan Langkah 1 menyebabkan Langkah 3 gagal dengan collection TTL is already set, cannot be set ttl field.
import random
from pymilvus import MilvusClient, DataType
client = MilvusClient(uri="http://localhost:19530")
# 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"},
])
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.common.DataType;
import io.milvus.v2.service.collection.request.AddCollectionFieldReq;
import io.milvus.v2.service.collection.request.AlterCollectionPropertiesReq;
import io.milvus.v2.service.collection.request.DropCollectionPropertiesReq;
import io.milvus.v2.service.vector.request.UpsertReq;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("http://localhost:19530")
.build());
// Assumes "my_collection" already exists with `collection.ttl.seconds` set.
// Step 1 — disable collection-level TTL (mandatory; the two modes are mutually exclusive)
client.dropCollectionProperties(DropCollectionPropertiesReq.builder()
.collectionName("my_collection")
.propertyKeys(Collections.singletonList("collection.ttl.seconds"))
.build());
// Step 2 — add a TIMESTAMPTZ column to the schema
client.addCollectionField(AddCollectionFieldReq.builder()
.collectionName("my_collection")
.fieldName("expire_at")
.dataType(DataType.Timestamptz)
.isNullable(true)
.build());
// Step 3 — set the ttl_field property on the column you just added
Map<String, String> ttlField = new HashMap<>();
ttlField.put("ttl_field", "expire_at");
client.alterCollectionProperties(AlterCollectionPropertiesReq.builder()
.collectionName("my_collection")
.properties(ttlField)
.build());
// Step 4 (optional) — backfill expiration timestamps for historical entities
Gson gson = new Gson();
Random rng = new Random();
List<Float> vector = new ArrayList<>();
for (int i = 0; i < 128; i++) vector.add(rng.nextFloat());
JsonObject row = new JsonObject();
row.addProperty("id", 1);
row.add("vector", gson.toJsonTree(vector));
row.addProperty("expire_at", "2026-12-31T00:00:00Z");
client.upsert(UpsertReq.builder()
.collectionName("my_collection")
.data(Collections.singletonList(row))
.build());
// nodejs
// go
# restful
Entitas historis yang tidak Anda isi ulang expire_at akan memiliki NULL di kolom tersebut, yang berarti entitas tersebut tidak pernah kedaluwarsa. Isi ulang hanya baris yang seharusnya memiliki masa hidup terbatas.
Beralih dari TTL tingkat entitas ke tingkat koleksi
Untuk berpindah ke arah lain, hapus ttl_field dan tetapkan collection.ttl.seconds:
from pymilvus import MilvusClient
client = MilvusClient(uri="http://localhost:19530")
# 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
)
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.collection.request.AlterCollectionPropertiesReq;
import io.milvus.v2.service.collection.request.DropCollectionPropertiesReq;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("http://localhost:19530")
.build());
// Assumes "my_collection" already exists with `ttl_field` set.
client.dropCollectionProperties(DropCollectionPropertiesReq.builder()
.collectionName("my_collection")
.propertyKeys(Collections.singletonList("ttl_field"))
.build());
Map<String, String> properties = new HashMap<>();
properties.put("collection.ttl.seconds", "1209600"); // 14 days
client.alterCollectionProperties(AlterCollectionPropertiesReq.builder()
.collectionName("my_collection")
.properties(properties)
.build());
// nodejs
// go
# restful
Pertanyaan yang Sering Diajukan
Kapan data kedaluwarsa karena pengaturan TTL?
Saat ini, data kedaluwarsa berdasarkan titik waktu saat data tersebut disisipkan atau diunggah. Data yang kedaluwarsa tidak akan ditampilkan dalam hasil pencarian. Untuk detailnya, lihat Contoh.
Kapan data kedaluwarsa akan dihapus secara fisik?
Setelah data kedaluwarsa, data tersebut tidak akan disertakan dalam hasil pencarian apa pun. Namun, data tersebut akan dihapus secara fisik hanya setelah pemadatan sistem berikutnya, sesuai dengan kebijakan pemadatan cluster Anda.