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)
}