Inserimento di Entità

Questo argomento descrive come inserire dati in Milvus dal lato client.

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

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

Nell'esempio seguente vengono inserite 2.000 righe di dati generati casualmente come dati di esempio (l'esempio dell'interfaccia a riga di comando Milvus utilizza un file CSV remoto pre-costruito contenente dati simili). Le applicazioni reali potrebbero utilizzare vettori di dimensioni più alte rispetto all'esempio. È possibile preparare i propri dati per sostituire l'esempio.

Preparare i 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 i valori predefiniti per i campi scalari, escludendo i campi chiave primaria. Ciò significa che durante l'inserimento o l'aggiornamento dei dati, è possibile lasciare alcuni campi vuoti. Per ulteriori informazioni, fare riferimento alla creazione di una collezione.

Dopo aver abilitato lo schema dinamico, è possibile aggiungere campi dinamici ai dati. Per ulteriori informazioni, fare riferimento allo schema dinamico.

bookIDs := make([]int64, 0, 2000)
wordCounts := make([]int64, 0, 2000)
bookIntros := make([][]float32, 0, 2000)
for i := 0; i < 2000; i++ {
	bookIDs = append(bookIDs, int64(i))
	wordCounts = append(wordCounts, int64(i+10000))
	v := make([]float32, 0, 2)
	for j := 0; j < 2; j++ {
		v = append(v, rand.Float32())
	}
	bookIntros = append(bookIntros, v)
}
idColumn := entity.NewColumnInt64("book_id", bookIDs)
wordColumn := entity.NewColumnInt64("word_count", wordCounts)
introColumn := entity.NewColumnFloatVector("book_intro", 2, bookIntros)

Inserire Dati in Milvus

Inserire i dati in una collezione.

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

_, err = milvusClient.Insert(
	context.Background(), // ctx
	"book",               // NomeCollezione
	"",                   // nomePartizione
	idColumn,             // datiColonna
	wordColumn,           // datiColonna
	introColumn,          // datiColonna
)
if err != nil {
	log.Fatal("impossibile inserire i dati:", err.Error())
}
Parametro Descrizione
ctx Contesto utilizzato per controllare il processo di chiamata dell'API.
NomeCollezione Nome della collezione in cui inserire i dati.
nomePartizione Nome della partizione in cui inserire i dati. Se lasciato vuoto, i dati verranno inseriti nella partizione predefinita.
datiColonna Dati da inserire in ciascun campo.

Dopo aver inserito entità in una collezione che è già stata indicizzata, non è necessario indicizzare nuovamente la collezione perché Milvus creerà automaticamente un indice per i dati appena inseriti.

Aggiornamento dei Dati in Milvus

Quando i dati vengono inseriti in Milvus, vengono inseriti in segmenti. I segmenti devono raggiungere una certa dimensione per essere sigillati e indicizzati. I segmenti non sigillati saranno interrogati tramite una ricerca forzata. Per evitare questa situazione, è meglio chiamare flush(). Il metodo flush() sigilla eventuali segmenti rimanenti e li invia all'indice. È molto importante chiamare questo metodo solo quando termina la sessione di inserimento. Chiamare troppo frequentemente questo metodo può portare a dati frammentati, che dovranno essere puliti in seguito.

Limitazioni

Caratteristica Limite Massimo
Dimensione Vettore 32.768

Aggiornamento dei Dati

Preparazione dei dati

Prima di tutto, prepara 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, ad eccezione dei campi chiave primari. Ciò significa che durante il processo di inserimento o aggiornamento dei dati, alcuni campi possono rimanere vuoti. Per ulteriori informazioni, consulta la creazione della collezione.

nEntità := 3000
dim := 8
idList := make([]int64, 0, nEntità)
randomList := make([]float64, 0, nEntità)
embeddingList := make([][]float32, 0, nEntità)

for i := 0; i < nEntità; i++ {
    idList = append(idList, int64(i))
}

for i := 0; i < nEntità; i++ {
    randomList = append(randomList, rand.Float64())
}

for i := 0; i < nEntità; i++ {
    vec := make([]float32, 0, dim)
    for j := 0; j < dim; j++ {
        vec = append(vec, rand.Float32())
    }
    embeddingList = append(embeddingList, vec)
}
idColData := entity.NewColumnInt64("ID", idList)
randomColData := entity.NewColumnDouble("random", randomList)
embeddingColData := entity.NewColumnFloatVector("embeddings", dim, embeddingList)

Aggiornamento dei dati

Aggiorna i dati nella collezione.

if _, err := c.Upsert(ctx, nomeCollezione, "", idColData, embeddingColData);
err != nil {
    log.Fatalf("impossibile aggiornare i dati, err: %v", err)
}