Inserción de Entidades

En este apartado se describe cómo insertar datos en Milvus desde el lado del cliente.

También puedes utilizar MilvusDM para migrar datos a Milvus. MilvusDM es una herramienta de código abierto diseñada específicamente para importar y exportar datos con Milvus.

Milvus 2.1 admite el tipo de datos VARCHAR para campos escalares. Al construir un índice para un campo escalar de tipo VARCHAR, el tipo de índice por defecto es un trie.

En el siguiente ejemplo se insertan 2,000 filas de datos generados aleatoriamente como datos de ejemplo (el ejemplo del CLI de Milvus utiliza un archivo CSV remoto preconstruido que contiene datos similares). Las aplicaciones reales pueden utilizar vectores de dimensiones más altas que el ejemplo. Puedes preparar tus propios datos para reemplazar el ejemplo.

Preparar los Datos

Primero, prepara los datos que se van a insertar. El tipo de datos a insertar debe coincidir con el esquema de la colección, de lo contrario Milvus generará una excepción.

Milvus admite valores por defecto para campos escalares, excluyendo los campos de clave primaria. Esto significa que durante la inserción o actualización de datos, ciertos campos pueden quedar en blanco. Para obtener más información, consulta la creación de una colección.

Después de habilitar el esquema dinámico, puedes añadir campos dinámicos a los datos. Para obtener más información, consulta el 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)

Insertar Datos en Milvus

Inserta los datos en una colección.

Al especificar el partition_name, puedes elegir en qué partición insertar los datos.

_, err = milvusClient.Insert(
	context.Background(), // ctx
	"book",               // CollectionName
	"",                   // partitionName
	idColumn,             // columnarData
	wordColumn,           // columnarData
	introColumn,          // columnarData
)
if err != nil {
	log.Fatal("Error al insertar datos:", err.Error())
}
Parámetro Descripción
ctx Contexto utilizado para controlar el proceso de la llamada a la API.
CollectionName Nombre de la colección en la que se van a insertar los datos.
partitionName Nombre de la partición en la que se van a insertar los datos. Si se deja en blanco, los datos se insertarán en la partición por defecto.
columnarData Datos que se van a insertar en cada campo.

Después de insertar entidades en una colección que ya ha sido indexada, no es necesario volver a indexar la colección, ya que Milvus creará automáticamente un índice para los datos recién insertados.

Actualización de Datos en Milvus

Cuando se insertan datos en Milvus, se insertan en segmentos. Los segmentos deben alcanzar un cierto tamaño para ser sellados e indexados. Los segmentos no sellados se consultarán a través de una búsqueda por fuerza bruta. Para evitar esta situación, es mejor llamar a flush(). El método flush() sella cualquier segmento restante y los envía al índice. Es muy importante llamar a este método solo cuando la sesión de inserción finalice. Llamar a este método con demasiada frecuencia puede resultar en datos fragmentados, que luego necesitarán ser limpiados.

Limitaciones

Característica Límite Máximo
Dimensión del Vector 32,768

Actualización de Datos

Preparando los Datos

Primero, prepara los datos que se van a actualizar. El tipo de datos a actualizar debe coincidir con el esquema de la colección; de lo contrario, Milvus arrojará una excepción.

Milvus admite valores predeterminados para campos escalares, excepto para campos de clave primaria. Esto significa que durante el proceso de inserción o actualización de datos, ciertos campos pueden permanecer vacíos. Para obtener más información, consulta la creación de colecciones.

nEntidades := 3000
dimensión := 8
listaID := make([]int64, 0, nEntidades)
listaAleatoria := make([]float64, 0, nEntidades)
listaIncrustaciones := make([][]float32, 0, nEntidades)

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

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

for i := 0; i < nEntidades; i++ {
    vec := make([]float32, 0, dimensión)
    for j := 0; j < dimensión; j++ {
        vec = append(vec, rand.Float32())
    }
    listaIncrustaciones = append(listaIncrustaciones, vec)
}
datosColID := entity.NewColumnInt64("ID", listaID)
datosColAleatorios := entity.NewColumnDouble("aleatorio", listaAleatoria)
datosColIncrustaciones := entity.NewColumnFloatVector("incrustaciones", dimensión, listaIncrustaciones)

Actualización de Datos

Actualiza los datos en la colección.

if _, err := c.Upsert(ctx, nombreColeccion, "", datosColID, datosColIncrustaciones);
err != nil {
    log.Fatalf("Error al actualizar los datos, err: %v", err)
}