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