Impostare il TTL della raccolta
Una volta inseriti in una raccolta, i dati vi rimangono per impostazione predefinita. Tuttavia, in alcuni scenari, si può desiderare di rimuovere o ripulire i dati dopo un certo periodo. In questi casi, è possibile configurare la proprietà Time-to-Live (TTL) della raccolta in modo che Milvus cancelli automaticamente i dati una volta scaduto il TTL.
Panoramica
Il Time-to-Live (TTL) è comunemente usato nei database per scenari in cui i dati devono rimanere validi o accessibili solo per un certo periodo dopo qualsiasi inserimento o modifica. Poi, i dati possono essere rimossi automaticamente.
Ad esempio, se i dati vengono inseriti quotidianamente ma è necessario conservare i record solo per 14 giorni, è possibile configurare Milvus per rimuovere automaticamente i dati più vecchi impostando il TTL della raccolta a 14 × 24 × 3600 = 1209600 secondi. In questo modo si garantisce che nella raccolta rimangano solo i dati più recenti di 14 giorni.
Le entità scadute non appariranno nei risultati delle ricerche o delle query. Tuttavia, possono rimanere nell'archivio fino alla successiva compattazione dei dati, che dovrebbe essere effettuata entro le 24 ore successive.
È possibile controllare quando attivare la compattazione dei dati impostando la voce di configurazione dataCoord.compaction.expiry.tolerance nel file di configurazione di Milvus.
Il valore predefinito di questa voce di configurazione è -1, che indica che si applica l'intervallo di compattazione dei dati esistente. Tuttavia, se si modifica il suo valore in un numero intero positivo, come 12, la compattazione dei dati verrà attivata il numero di ore specificato dopo che le entità sono scadute.
La proprietà TTL in una raccolta Milvus è specificata come un numero intero in secondi. Una volta impostata, tutti i dati che superano il loro TTL vengono automaticamente eliminati dalla raccolta.
Poiché il processo di cancellazione è asincrono, i dati potrebbero non essere rimossi dai risultati di ricerca esattamente una volta trascorso il TTL specificato. Al contrario, potrebbe esserci un ritardo, poiché la rimozione dipende dai processi di garbage collection (GC) e di compattazione, che avvengono a intervalli non deterministici.
Impostare il TTL
È possibile impostare la proprietà TTL quando si
Impostare il TTL quando si crea un insieme
Il seguente frammento di codice mostra come impostare la proprietà TTL quando si crea una collezione.
from pymilvus import MilvusClient
# With TTL
client.create_collection(
collection_name="my_collection",
schema=schema,
properties={
"collection.ttl.seconds": 1209600
}
)
import io.milvus.v2.service.collection.request.CreateCollectionReq;
import io.milvus.v2.service.collection.request.AlterCollectionReq;
import io.milvus.param.Constant;
import java.util.HashMap;
import java.util.Map;
// With TTL
CreateCollectionReq customizedSetupReq = CreateCollectionReq.builder()
.collectionName("my_collection")
.collectionSchema(schema)
.property(Constant.TTL_SECONDS, "1209600")
.build();
client.createCollection(customizedSetupReq);
const createCollectionReq = {
collection_name: "my_collection",
schema: schema,
properties: {
"collection.ttl.seconds": 1209600
}
}
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
}"
Impostare il TTL per un insieme esistente
Il seguente frammento di codice mostra come modificare la proprietà TTL in una collezione esistente.
client.alter_collection_properties(
collection_name="my_collection",
properties={"collection.ttl.seconds": 1209600}
)
Map<String, String> properties = new HashMap<>();
properties.put("collection.ttl.seconds", "1209600");
AlterCollectionReq alterCollectionReq = AlterCollectionReq.builder()
.collectionName("my_collection")
.properties(properties)
.build();
client.alterCollection(alterCollectionReq);
res = await client.alterCollection({
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
}
}"
Eliminare l'impostazione TTL
Se si decide di mantenere i dati in una collezione a tempo indeterminato, si può semplicemente eliminare l'impostazione TTL da quella collezione.
client.drop_collection_properties(
collection_name="my_collection",
property_keys=["collection.ttl.seconds"]
)
propertyKeys = new String[1]
propertyKeys[0] = "collection.ttl.second"
DropCollectionReq dropCollectionReq = DropCollectionReq.builder()
.collectionName("my_collection")
.propertyKeys(propertyKeys)
.build();
client.dropCollection(dropCollectionReq);
res = 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/alter_properties" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d "{
\"collectionName\": \""my_collection"\",
\"properties\": {
\"collection.ttl.seconds\": 60
}
}"