Inserimento di entità

Questa sezione descrive come inserire dati in Milvus tramite il lato client.

È inoltre possibile utilizzare MilvusDM per migrare i dati in Milvus. MilvusDM è un tool open-source progettato appositamente per l'importazione e l'esportazione dei dati di Milvus.

Milvus 2.1 supporta il tipo di dato VARCHAR su campi scalari. Quando si costruisce un indice per un campo scalare di tipo VARCHAR, il tipo di indice predefinito è un albero trie.

Nell'esempio seguente vengono inserite 2.000 righe di dati generati casualmente come dati di esempio (l'esempio Milvus CLI utilizza un file CSV remoto pre-costruito contenente dati simili). Le applicazioni reali spesso usano vettori di dimensioni più elevate rispetto all'esempio. È possibile preparare i propri dati per sostituire i dati di esempio.

Preparazione dei dati

Innanzitutto, preparare i dati da inserire. Il tipo di dati da inserire deve corrispondere allo schema della collezione, altrimenti Milvus genererà un'eccezione.

Milvus supporta valori predefiniti per i campi scalari, tranne per i campi chiave primari. Ciò significa che durante l'inserimento o l'aggiornamento dei dati, alcuni campi possono essere lasciati vuoti. Per ulteriori informazioni, consultare la sezione Creazione di una Collezione.

Dopo aver abilitato lo schema dinamico, è possibile aggiungere campi dinamici ai dati. Per informazioni dettagliate, vedere Schema Dinamico.

import random
data = [
  [i for i in range(2000)],
  [str(i) for i in range(2000)],
  [i for i in range(10000, 12000)],
  [[random.random() for _ in range(2)] for _ in range(2000)],
  [], 
  None,
]

data.append([str("dy"*i) for i in range(2000)])

Inserimento dei dati in Milvus

Inserire i dati nella collezione.

Specificando partition_name, è possibile scegliere in quale partizione inserire i dati.

from pymilvus import Collection
collection = Collection("book")      # Ottieni una collezione esistente.
mr = collection.insert(data)
Parametro Descrizione
data I dati da inserire in Milvus.
partition_name (opzionale) Il nome della partizione in cui verranno inseriti i dati.

Dopo aver inserito entità in una collezione precedentemente indicizzata, non è necessario ricreare l'indice della collezione, poiché Milvus creerà automaticamente degli indici per i dati appena inseriti. Per ulteriori informazioni, consultare la sezione Possono Essere Creati Indici Dopo l'Inserimento dei Vettori?

Aggiornamento dei Dati in Milvus

Quando i dati vengono inseriti in Milvus, vengono inseriti in segmenti. I segmenti devono raggiungere una determinata dimensione per essere sigillati e indicizzati. I segmenti non sigillati utilizzeranno una ricerca forzata. Per evitare questa situazione, è meglio chiamare flush() per tutti i dati rimanenti. La chiamata a flush() sigillerà i segmenti rimanenti e li invierà all'indice. È importante chiamare questo metodo solo alla fine di una sessione di inserimento. Chiamarlo troppo frequentemente può portare a dati frammentati che dovranno essere puliti in seguito.

Limitazioni

Funzionalità Limite Massimo
Dimensione vettoriale 32.768

Aggiornamento di Entità (Upsert Entity)

L'aggiornamento tramite upsert è una combinazione di operazioni di inserimento e cancellazione. Nel contesto del database vettoriale di Milvus, l'aggiornamento è un'operazione a livello di dati. Sovrascrive l'entità esistente se il campo specificato esiste nella collezione e inserisce una nuova entità se il valore specificato non esiste.

Nell'esempio seguente vengono aggiornate 3.000 righe di dati generati casualmente come dati di esempio. Quando si esegue l'operazione di aggiornamento, è importante notare che questa operazione può influire sulle prestazioni perché comporta la cancellazione dei dati.

Preparazione dei Dati

Innanzitutto, preparare i dati da aggiornare. Il tipo di dati da aggiornare deve corrispondere allo schema della collezione, altrimenti Milvus genererà un'eccezione.

Milvus supporta valori predefiniti per i campi scalari, tranne per i campi chiave primari. Ciò significa che durante l'inserimento o l'aggiornamento dei dati, alcuni campi possono essere lasciati vuoti. Per ulteriori informazioni, consultare la sezione Creazione di una Collezione.

import random
nb = 3000
dim = 8
vectors = [[random.random() for _ in range(dim)] for _ in range(nb)]
data = [
    [i for i in range(nb)],
    [str(i) for i in range(nb)],
    [i for i in range(10000, 10000+nb)],
    vectors,
    [str("dy"*i) for i in range(nb)]
]

Aggiornamento dei Dati

Aggiornare i dati nella collezione.

from pymilvus import Collection
collection = Collection("book")  # Ottieni la collezione esistente.
mr = collection.upsert(data)

Cancellazione di Entità

Milvus supporta la cancellazione delle entità tramite espressioni booleane attraverso le chiavi primarie.

Preparare l'espressione booleana

Prepara un'espressione booleana per filtrare le entità da eliminare.

Milvus supporta solo l'eliminazione delle entità con chiavi primarie specificate esplicitamente, che può essere ottenuto utilizzando l'operatore "in". Altri operatori possono essere utilizzati solo nel filtraggio scalare per query o ricerca vettoriale.

Nell'esempio seguente vengono filtrati i dati utilizzando i valori delle chiavi primarie 0 e 1.

expr = "book_id in [0,1]"

Simile alla clausola WHERE di SQL

Eliminare l'entità

Utilizza l'espressione booleana creata per eliminare le entità. Milvus restituirà l'elenco delle ID delle entità eliminate.

from pymilvus import Collection
collection = Collection("book")      # Ottieni la collezione esistente.
collection.delete(expr)

Comprimere i Dati

Milvus supporta la compressione automatica dei dati per impostazione predefinita. È possibile configurare Milvus per abilitare o disabilitare la compressione automatica.

Se la compressione automatica è disabilitata, è comunque possibile comprimere manualmente i dati.

Comprimere manualmente i dati

Poiché la compressione di solito richiede molto tempo, le richieste di compressione vengono elaborate in modo asincrono.

from pymilvus import Collection
collection = Collection("book")      # Ottieni la collezione esistente.
collection.compact()

Verificare lo stato di compressione

È possibile utilizzare l'ID di compressione restituito durante l'attivazione della compressione manuale per verificare lo stato di compressione.

collection.get_compaction_state()