Inserindo Entidades

Este tópico descreve como inserir dados no Milvus do lado do cliente.

Também é possível utilizar o MilvusDM para migrar dados para o Milvus. O MilvusDM é uma ferramenta de código aberto projetada especificamente para importar e exportar dados com o Milvus.

O Milvus 2.1 suporta o tipo de dados VARCHAR para campos escalares. Ao construir um índice para um campo escalar do tipo VARCHAR, o tipo de índice padrão é uma árvore.

O exemplo a seguir insere 2.000 linhas de dados gerados aleatoriamente como dados de amostra (o exemplo do Milvus CLI usa um arquivo CSV remoto pré-construído contendo dados semelhantes). Aplicações reais podem utilizar vetores de dimensões mais altas do que o exemplo. Você pode preparar seus próprios dados para substituir o exemplo.

Preparando os Dados

Primeiro, prepare os dados a serem inseridos. O tipo de dados a ser inserido deve corresponder ao esquema da coleção, caso contrário o Milvus lançará uma exceção.

O Milvus suporta valores padrão para campos escalares, excluindo campos de chave primária. Isso significa que durante a inserção ou atualização dos dados, certos campos podem ficar em branco. Para mais informações, consulte a criação de uma coleção.

Após habilitar o esquema dinâmico, é possível adicionar campos dinâmicos aos dados. Para mais informações, consulte o esquema dinâmico.

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)

Inserindo Dados no Milvus

Insira os dados em uma coleção.

Ao especificar o partition_name, você pode escolher em qual partição inserir os dados.

_, err = milvusClient.Insert(
	contexto.Background(), // ctx
	"livro",               // CollectionName
	"",                   // partitionName
	idColumn,             // columnarData
	wordColumn,           // columnarData
	introColumn,          // columnarData
)
if err != nil {
	log.Fatal("falha ao inserir dados:", err.Error())
}
Parâmetro Descrição
ctx Contexto usado para controlar o processo de chamada da API.
CollectionName Nome da coleção para inserir os dados.
partitionName Nome da partição para inserir os dados. Se deixado em branco, os dados serão inseridos na partição padrão.
columnarData Dados a serem inseridos em cada campo.

Após inserir entidades em uma coleção que já foi indexada, não é necessário reindexar a coleção, pois o Milvus automaticamente cria um índice para os dados recém-inseridos.

Atualizando Dados no Milvus

Quando os dados são inseridos no Milvus, eles são inseridos em segmentos. Os segmentos devem atingir um tamanho específico para serem selados e indexados. Segmentos não selados serão consultados por meio de busca por força bruta. Para evitar essa situação, é melhor chamar flush(). O método flush() sela quaisquer segmentos restantes e os envia para o índice. É muito importante chamar este método apenas quando a sessão de inserção terminar. Chamar este método com muita frequência pode levar a dados fragmentados, que precisarão ser limpos posteriormente.

Limitações

Recurso Limite Máximo
Dimensão do Vetor 32.768

Atualizando Dados

Preparação de Dados

Primeiro, prepare os dados a serem atualizados. O tipo de dados a ser atualizado deve corresponder ao esquema da coleção, caso contrário o Milvus lançará uma exceção.

O Milvus suporta valores padrão para campos escalares, exceto para campos de chave primária. Isso significa que durante o processo de inserção ou atualização de dados, certos campos podem permanecer vazios. Para mais informações, consulte a criação da coleção.

nEntidades := 3000
dimensao := 8
listaIds := make([]int64, 0, nEntidades)
listaAleatoria := make([]float64, 0, nEntidades)
listaEmbeddings := make([][]float32, 0, nEntidades)

for i := 0; i < nEntidades; i++ {
    listaIds = append(listaIds, int64(i))
}

for i := 0; i < nEntidades; i++ {
    listaAleatoria = append(listaAleatoria, rand.Float64())
}

for i := 0; i < nEntidades; i++ {
    vec := make([]float32, 0, dimensao)
    for j := 0; j < dimensao; j++ {
        vec = append(vec, rand.Float32())
    }
    listaEmbeddings = append(listaEmbeddings, vec)
}
dadosColunaId := entity.NewColumnInt64("ID", listaIds)
dadosColunaAleatoria := entity.NewColumnDouble("aleatorio", listaAleatoria)
dadosColunaEmbeddings := entity.NewColumnFloatVector("embeddings", dimensao, listaEmbeddings)

Atualização de Dados

Atualize os dados na coleção.

if _, err := c.Upsert(ctx, nomeColecao, "", dadosColunaId, dadosColunaEmbeddings);
err != nil {
    log.Fatalf("falha ao atualizar os dados, err: %v", err)
}