Gestire le partizioni
Questa guida spiega come creare e gestire le partizioni in una raccolta.
Panoramica
Una partizione in Milvus rappresenta una suddivisione di una collezione. Questa funzionalità consente di suddividere lo storage fisico di una collezione in più parti, contribuendo a migliorare le prestazioni delle interrogazioni, restringendo l'attenzione a un sottoinsieme più piccolo di dati piuttosto che all'intera collezione.
Alla creazione di una raccolta, viene creata automaticamente almeno una partizione predefinita, denominata _default. È possibile creare un massimo di 1.024 partizioni all'interno di una raccolta.
note
Milvus introduce una funzione chiamata Chiave di partizione, che sfrutta le partizioni sottostanti per memorizzare entità basate sui valori hash di un campo specifico. Questa funzione facilita l'implementazione della multi-tenancy, migliorando le prestazioni di ricerca. Per ulteriori informazioni, leggere Uso della chiave di partizione.
Se la funzione Chiave di partizione è attiva in una collezione, Milvus si occupa di gestire tutte le partizioni, sollevando l'utente da questa responsabilità.
Preparazione
Il frammento di codice seguente ripropone il codice esistente per stabilire una connessione a Milvus e creare una raccolta in modalità di impostazione rapida, indicando che la raccolta viene caricata al momento della creazione.
Per la preparazione, usare MilvusClient
per connettersi a Milvus e create_collection()
per creare una raccolta in modalità di impostazione rapida.
Per le preparazioni, usare MilvusClientV2
per connettersi a Milvus e createCollection()
per creare una raccolta in modalità di configurazione rapida.
Per le preparazioni, usare MilvusClient
per connettersi a Milvus e createCollection()
per creare una raccolta in modalità di configurazione rapida.
from pymilvus import MilvusClient, DataType
# 1. Set up a Milvus client
client = MilvusClient(
uri="http://localhost:19530"
)
# 2. Create a collection
client.create_collection(
collection_name="quick_setup",
dimension=5,
)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.collection.request.CreateCollectionReq;
String CLUSTER_ENDPOINT = "http://localhost:19530";
// 1. Connect to Milvus server
ConnectConfig connectConfig = ConnectConfig.builder()
.uri(CLUSTER_ENDPOINT)
.build();
MilvusClientV2 client = new MilvusClientV2(connectConfig);
// 2. Create a collection in quick setup mode
CreateCollectionReq quickSetupReq = CreateCollectionReq.builder()
.collectionName("quick_setup")
.dimension(5)
.build();
client.createCollection(quickSetupReq);
const address = "http://localhost:19530"
// 1. Set up a Milvus Client
client = new MilvusClient({address});
// 2. Create a collection in quick setup mode
await client.createCollection({
collection_name: "quick_setup",
dimension: 5,
});
note
Nel frammento di codice sopra riportato, l'indice della collezione è stato creato insieme alla collezione, a indicare che la collezione viene caricata al momento della creazione.
Elencare le partizioni
Una volta che un insieme è pronto, è possibile elencare le sue partizioni.
Per elencare le partizioni, usare list_partitions()
.
Per elencare le partizioni, usare listPartitions()
.
Per elencare le partizioni, usare listPartitions()
.
# 3. List partitions
res = client.list_partitions(collection_name="quick_setup")
print(res)
# Output
#
# ["_default"]
import io.milvus.v2.service.partition.request.ListPartitionsReq;
// 3. List all partitions in the collection
ListPartitionsReq listPartitionsReq = ListPartitionsReq.builder()
.collectionName("quick_setup")
.build();
List<String> partitionNames = client.listPartitions(listPartitionsReq);
System.out.println(partitionNames);
// Output:
// ["_default"]
// 3. List partitions
res = await client.listPartitions({
collection_name: "quick_setup"
})
console.log(res.partition_names)
// Output
//
// [ '_default' ]
//
L'output di questo frammento di codice include i nomi delle partizioni all'interno dell'insieme specificato.
note
Se si imposta un campo come chiave di partizione in una collezione, Milvus crea almeno 64 partizioni insieme alla collezione. Quando si elencano le partizioni, i risultati possono essere diversi da quelli ottenuti con i frammenti di codice precedenti.
Per maggiori dettagli, consultare la sezione Uso della chiave di partizione.
Creare partizioni
È possibile aggiungere altre partizioni all'insieme. Una raccolta può avere fino a 1.024 partizioni.
Per creare partizioni, usare create_partition()
.
Per creare partizioni, usare createPartition()
.
Per creare partizioni, usare createPartition()
.
# 4. Create more partitions
client.create_partition(
collection_name="quick_setup",
partition_name="partitionA"
)
client.create_partition(
collection_name="quick_setup",
partition_name="partitionB"
)
res = client.list_partitions(collection_name="quick_setup")
print(res)
# Output
#
# ["_default", "partitionA", "partitionB"]
import io.milvus.v2.service.partition.request.CreatePartitionReq;
// 4. Create more partitions
CreatePartitionReq createPartitionReq = CreatePartitionReq.builder()
.collectionName("quick_setup")
.partitionName("partitionA")
.build();
client.createPartition(createPartitionReq);
createPartitionReq = CreatePartitionReq.builder()
.collectionName("quick_setup")
.partitionName("partitionB")
.build();
client.createPartition(createPartitionReq);
listPartitionsReq = ListPartitionsReq.builder()
.collectionName("quick_setup")
.build();
partitionNames = client.listPartitions(listPartitionsReq);
System.out.println(partitionNames);
// Output:
// [
// "_default",
// "partitionA",
// "partitionB"
// ]
// 4. Create more partitions
await client.createPartition({
collection_name: "quick_setup",
partition_name: "partitionA"
})
await client.createPartition({
collection_name: "quick_setup",
partition_name: "partitionB"
})
res = await client.listPartitions({
collection_name: "quick_setup"
})
console.log(res.partition_names)
// Output
//
// [ '_default', 'partitionA', 'partitionB' ]
//
Il frammento di codice qui sopra crea una partizione in un insieme ed elenca le partizioni dell'insieme.
note
Se si imposta un campo come chiave di partizione in un insieme, Milvus si occupa di gestire le partizioni dell'insieme. Pertanto, è possibile che si verifichino errori di richiesta quando si tenta di creare partizioni.
Per ulteriori informazioni, consultare la sezione Utilizzo della chiave di partizione.
Verifica di una partizione specifica
È anche possibile verificare l'esistenza di una partizione specifica.
Per verificare la presenza di una partizione specifica, usare has_partition()
.
Per verificare la presenza di una partizione specifica, usare hasPartition()
.
Per verificare la presenza di una partizione specifica, usare hasPartition()
.
# 5. Check whether a partition exists
res = client.has_partition(
collection_name="quick_setup",
partition_name="partitionA"
)
print(res)
# Output
#
# True
res = client.has_partition(
collection_name="quick_setup",
partition_name="partitionC"
)
print(res)
# Output
#
# False
import io.milvus.v2.service.partition.request.HasPartitionReq;
// 5. Check whether a partition exists
HasPartitionReq hasPartitionReq = HasPartitionReq.builder()
.collectionName("quick_setup")
.partitionName("partitionA")
.build();
boolean exists = client.hasPartition(hasPartitionReq);
System.out.println(exists);
// Output:
// true
hasPartitionReq = HasPartitionReq.builder()
.collectionName("quick_setup")
.partitionName("partitionC")
.build();
exists = client.hasPartition(hasPartitionReq);
System.out.println(exists);
// Output:
// false
// 5. Check whether a partition exists
res = await client.hasPartition({
collection_name: "quick_setup",
partition_name: "partitionA"
})
console.log(res.value)
// Output
//
// true
//
res = await client.hasPartition({
collection_name: "quick_setup",
partition_name: "partitionC"
})
console.log(res.value)
// Output
//
// false
//
Lo snippet di codice qui sopra controlla se l'insieme ha una partizione chiamata partitionA
e partitionC
.
Caricare e rilasciare partizioni
È possibile caricare e rilasciare partizioni specifiche per renderle disponibili o meno per ricerche e interrogazioni.
Ottenere lo stato di caricamento
Per verificare lo stato di caricamento di un insieme e delle sue partizioni, si può usare il comando get_load_state()
.
Per controllare lo stato di caricamento di una raccolta e delle sue partizioni, usare getLoadState()
.
Per controllare lo stato di carico di un insieme e delle sue partizioni, usare getLoadState()
.
# Release the collection
client.release_collection(collection_name="quick_setup")
# Check the load status
res = client.get_load_state(collection_name="quick_setup")
print(res)
# Output
#
# {
# "state": "<LoadState: Loaded>"
# }
res = client.get_load_state(
collection_name="quick_setup",
partition_name="partitionA"
)
print(res)
# Output
#
# {
# "state": "<LoadState: Loaded>"
# }
res = client.get_load_state(
collection_name="quick_setup",
partition_name="partitionB"
)
print(res)
# Output
#
# {
# "state": "<LoadState: NotLoad>"
# }
import io.milvus.v2.service.collection.request.GetLoadStateReq;
import io.milvus.v2.service.collection.request.ReleaseCollectionReq;
import io.milvus.v2.service.partition.request.LoadPartitionsReq;
import io.milvus.v2.service.partition.request.ReleasePartitionsReq;
// 6. Load a partition independantly
// 6.1 Release the collection
ReleaseCollectionReq releaseCollectionReq = ReleaseCollectionReq.builder()
.collectionName("quick_setup")
.build();
client.releaseCollection(releaseCollectionReq);
// 6.2 Load partitionA
LoadPartitionsReq loadPartitionsReq = LoadPartitionsReq.builder()
.collectionName("quick_setup")
.partitionNames(List.of("partitionA"))
.build();
client.loadPartitions(loadPartitionsReq);
Thread.sleep(3000);
// 6.3 Check the load status of the collection and its partitions
GetLoadStateReq getLoadStateReq = GetLoadStateReq.builder()
.collectionName("quick_setup")
.build();
boolean state = client.getLoadState(getLoadStateReq);
System.out.println(state);
// Output:
// true
getLoadStateReq = GetLoadStateReq.builder()
.collectionName("quick_setup")
.partitionName("partitionA")
.build();
state = client.getLoadState(getLoadStateReq);
System.out.println(state);
// Output:
// true
getLoadStateReq = GetLoadStateReq.builder()
.collectionName("quick_setup")
.partitionName("partitionB")
.build();
state = client.getLoadState(getLoadStateReq);
System.out.println(state);
// Output:
// false
// 6. Load a partition indenpendantly
await client.releaseCollection({
collection_name: "quick_setup"
})
res = await client.getLoadState({
collection_name: "quick_setup"
})
console.log(res.state)
// Output
//
// LoadStateNotLoad
//
await client.loadPartitions({
collection_name: "quick_setup",
partition_names: ["partitionA"]
})
await sleep(3000)
res = await client.getLoadState({
collection_name: "quick_setup"
})
console.log(res.state)
// Output
//
// LoadStateLoaded
//
res = await client.getLoadState({
collection_name: "quick_setup",
partition_name: "partitionA"
})
console.log(res.state)
// Output
//
// LoadStateLoaded
//
res = await client.getLoadState({
collection_name: "quick_setup",
partition_name: "partitionB"
})
console.log(res.state)
// Output
//
// LoadStateLoaded
//
Lo stato di caricamento può essere uno dei seguenti
Caricato
Un insieme è contrassegnato come
Loaded
se almeno una delle sue partizioni è stata caricata.Non caricato
Un insieme è contrassegnato come
NotLoad
se nessuna delle sue partizioni è stata caricata.Carico
Una collezione è contrassegnata come Loading se almeno una delle sue partizioni è in fase di caricamento.
Caricare le partizioni
Per caricare tutte le partizioni di un insieme, è sufficiente richiamare il comando load_collection()
. Per caricare partizioni specifiche di un insieme, si può usare il comando load_partitions()
.
Per caricare tutte le partizioni di un insieme, è sufficiente richiamare il comando loadCollection()
. Per caricare partizioni specifiche di un insieme, usare loadPartitions()
.
Per caricare tutte le partizioni di un insieme, è sufficiente richiamare il comando loadCollection()
. Per caricare partizioni specifiche di un insieme, usare loadPartitions()
.
client.load_partitions(
collection_name="quick_setup",
partition_names=["partitionA"]
)
res = client.get_load_state(collection_name="quick_setup")
print(res)
# Output
#
# {
# "state": "<LoadState: Loaded>"
# }
LoadPartitionsReq loadPartitionsReq = LoadPartitionsReq.builder()
.collectionName("quick_setup")
.partitionNames(List.of("partitionA"))
.build();
client.loadPartitions(loadPartitionsReq);
getLoadStateReq = GetLoadStateReq.builder()
.collectionName("quick_setup")
.partitionName("partitionA")
.build();
state = client.getLoadState(getLoadStateReq);
System.out.println(state);
// Output:
// true
await client.loadPartitions({
collection_name: "quick_setup",
partition_names: ["partitionA"]
})
res = await client.getLoadState({
collection_name: "quick_setup",
partition_name: "partitionA"
})
console.log(res.state)
// Output
//
// LoadStateLoaded
//
Per caricare più partizioni alla volta, procedere come segue:
client.load_partitions(
collection_name="quick_setup",
partition_names=["partitionA", "partitionB"]
)
res = client.get_load_state(
collection_name="quick_setup",
partition_name="partitionA"
)
# Output
#
# {
# "state": "<LoadState: Loaded>"
# }
res = client.get_load_state(
collection_name="quick_setup",
partition_name="partitionB"
)
# Output
#
# {
# "state": "<LoadState: Loaded>"
# }
LoadPartitionsReq loadPartitionsReq = LoadPartitionsReq.builder()
.collectionName("quick_setup")
.partitionNames(List.of("partitionA", "partitionB"))
.build();
client.loadPartitions(loadPartitionsReq);
getLoadStateReq = GetLoadStateReq.builder()
.collectionName("quick_setup")
.partitionName("partitionA")
.build();
state = client.getLoadState(getLoadStateReq);
System.out.println(state);
// Output:
// true
getLoadStateReq = GetLoadStateReq.builder()
.collectionName("quick_setup")
.partitionName("partitionB")
.build();
state = client.getLoadState(getLoadStateReq);
System.out.println(state);
// Output:
// true
await client.loadPartitions({
collection_name: "quick_setup",
partition_names: ["partitionA", "partitionB"]
})
res = await client.getLoadState({
collection_name: "quick_setup",
partition_name: "partitionA"
})
console.log(res)
// Output
//
// LoadStateLoaded
//
res = await client.getLoadState({
collection_name: "quick_setup",
partition_name: "partitionB"
})
console.log(res)
// Output
//
// LoadStateLoaded
//
Per caricare campi specifici in una o più partizioni, procedere come segue:
client.load_partitions(
collection_name="quick_setup",
partition_names=["partitionA"],
load_fields=["id", "vector"],
skip_load_dynamic_field=True
)
Si noti che solo i campi elencati in load_fields
possono essere usati come condizioni di filtraggio e campi di output nelle ricerche e nelle query. È necessario includere sempre la chiave primaria nell'elenco. I nomi dei campi esclusi dal caricamento non saranno disponibili per il filtraggio o l'output.
È possibile utilizzare skip_load_dynamic_field=True
per saltare il caricamento del campo dinamico. Milvus tratta il campo dinamico come un singolo campo, quindi tutte le chiavi del campo dinamico saranno incluse o escluse insieme.
Rilasciare le partizioni
Per rilasciare tutte le partizioni di un insieme, è sufficiente chiamare il comando release_collection()
. Per rilasciare partizioni specifiche di un insieme, si può usare il comando release_partitions()
.
Per rilasciare tutte le partizioni di un insieme, è sufficiente richiamare il comando releaseCollection()
. Per rilasciare partizioni specifiche di un insieme, usare releasePartitions()
.
Per rilasciare tutte le partizioni di un insieme, è sufficiente richiamare il comando releaseCollection()
. Per rilasciare partizioni specifiche di un insieme, usare releasePartitions()
.
# 7. Release a partition
client.release_partitions(
collection_name="quick_setup",
partition_names=["partitionA"]
)
res = client.get_load_state(
collection_name="quick_setup",
partition_name="partitionA"
)
print(res)
# Output
#
# {
# "state": "<LoadState: NotLoad>"
# }
import io.milvus.v2.service.partition.request.ReleasePartitionsReq;
// 7. Release a partition
ReleasePartitionsReq releasePartitionsReq = ReleasePartitionsReq.builder()
.collectionName("quick_setup")
.partitionNames(List.of("partitionA"))
.build();
client.releasePartitions(releasePartitionsReq);
getLoadStateReq = GetLoadStateReq.builder()
.collectionName("quick_setup")
.partitionName("partitionA")
.build();
state = client.getLoadState(getLoadStateReq);
System.out.println(state);
// Output:
// false
// 7. Release a partition
await client.releasePartitions({
collection_name: "quick_setup",
partition_names: ["partitionA"]
})
res = await client.getLoadState({
collection_name: "quick_setup"
})
console.log(res.state)
// Output
//
// LoadStateNotLoad
//
Per rilasciare più partizioni alla volta, procedere come segue:
client.release_partitions(
collection_name="quick_setup",
partition_names=["_default", "partitionA", "partitionB"]
)
res = client.get_load_state(
collection_name="quick_setup",
)
# Output
#
# {
# "state": "<LoadState: NotLoad>"
# }
Rilasciare partizioni
Una volta rilasciata una partizione, è possibile eliminarla se non è più necessaria.
Per rilasciare una partizione, usare drop_partition()
.
Per eliminare una partizione, usare dropPartition()
.
Per eliminare una partizione, usare dropPartition()
.
# 8. Drop a partition
client.drop_partition(
collection_name="quick_setup",
partition_name="partitionB"
)
res = client.list_partitions(collection_name="quick_setup")
print(res)
# Output
#
# ["_default", "partitionA"]
import io.milvus.v2.service.partition.request.ReleasePartitionsReq;
ReleasePartitionsReq releasePartitionsReq = ReleasePartitionsReq.builder()
.collectionName("quick_setup")
.partitionNames(List.of("_default", "partitionA", "partitionB"))
.build();
client.releasePartitions(releasePartitionsReq);
getLoadStateReq = GetLoadStateReq.builder()
.collectionName("quick_setup")
.build();
state = client.getLoadState(getLoadStateReq);
System.out.println(state);
// Output:
// false
await client.releasePartitions({
collection_name: "quick_setup",
partition_names: ["_default", "partitionA", "partitionB"]
})
res = await client.getLoadState({
collection_name: "quick_setup"
})
console.log(res)
// Output
//
// {
// status: {
// error_code: 'Success',
// reason: '',
// code: 0,
// retriable: false,
// detail: ''
// },
// state: 'LoadStateNotLoad'
// }
//
note
Prima di rilasciare una partizione, è necessario liberarla dalla memoria.
DOMANDE FREQUENTI
Quanti dati si possono memorizzare in una partizione?
Si raccomanda di memorizzare meno di 1B di dati in una partizione.
Qual è il numero massimo di partizioni che possono essere create?
Per impostazione predefinita, Milvus consente di creare un massimo di 1.024 partizioni. È possibile regolare il numero massimo di partizioni configurando
rootCoord.maxPartitionNum
. Per maggiori dettagli, consultare la sezione Configurazioni di sistema.Come si fa a distinguere tra partizioni e chiavi di partizione?
Le partizioni sono unità di archiviazione fisiche, mentre le chiavi di partizione sono concetti logici che assegnano automaticamente i dati a partizioni specifiche in base a una colonna designata.
Ad esempio, in Milvus, se si dispone di una collezione con una chiave di partizione definita come campo
color
, il sistema assegna automaticamente i dati alle partizioni in base ai valori hash del campocolor
per ogni entità. Questo processo automatico solleva l'utente dalla responsabilità di specificare manualmente la partizione durante l'inserimento o la ricerca dei dati.D'altra parte, quando si creano manualmente le partizioni, è necessario assegnare i dati a ciascuna partizione in base ai criteri della chiave di partizione. Se si dispone di una collezione con un campo
color
, si dovranno assegnare manualmente le entità con un valorecolor
dired
apartition A
, e le entità con un valorecolor
diblue
apartition B
. Questa gestione manuale richiede uno sforzo maggiore.In sintesi, sia le partizioni che le chiavi di partizione vengono utilizzate per ottimizzare il calcolo dei dati e migliorare l'efficienza delle query. È essenziale riconoscere che l'abilitazione di una chiave di partizione significa rinunciare al controllo sulla gestione manuale dell'inserimento e del caricamento dei dati delle partizioni, poiché questi processi sono completamente automatizzati e gestiti da Milvus.