Inserción de entidades

Esta sección describe cómo insertar datos en Milvus a través del lado del cliente.

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

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

El siguiente ejemplo inserta 2,000 filas de datos generados aleatoriamente como datos de muestra (el ejemplo del CLI de Milvus utiliza un archivo CSV remoto preconstruido que contiene datos similares). Las aplicaciones del mundo real a menudo utilizan vectores de dimensiones más altas que el ejemplo. Puedes preparar tus propios datos para reemplazar los datos de muestra.

Preparación de datos

Primero, prepara los datos a ser insertados. 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 predeterminados para campos escalares, excepto para campos de clave primaria. Esto significa que durante la inserción o actualización de datos, algunos campos pueden quedar vacíos. 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 información detallada, consulta Esquema Dinámico.

import random
datos = [
  [i for i in range(2000)],
  [str(i) for i in range(2000)],
  [i for i in range(10000, 12000)],
  [[random.random() for _ in range(2)] for _ in range(2000)],
  [],
  None,
]

datos.append([str("dy"*i) for i in range(2000)])

Inserción de datos en Milvus

Inserta los datos en la colección.

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

from pymilvus import Collection
colección = Collection("libro")      # Obtiene una colección existente.
mr = colección.insert(datos)
Parámetro Descripción
data Los datos que se van a insertar en Milvus.
partition_name (opcional) El nombre de la partición donde se insertarán los datos.

Después de insertar entidades en una colección previamente indexada, no es necesario volver a indexar la colección, ya que Milvus creará automáticamente índices para los datos recién insertados. Para obtener más información, consulta ¿Se pueden crear índices después de insertar vectores?

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 usarán una búsqueda de fuerza bruta. Para evitar esta situación, es mejor llamar a flush() para cualquier dato restante. La llamada a flush() sellará cualquier segmento restante y los enviará al índice. Es importante llamar a este método solo al final de una sesión de inserción. Llamarlo con demasiada frecuencia puede provocar datos fragmentados que deberán limpiarse más tarde.

Limitaciones

Característica Límite máximo
Dimensión del vector 32,768

Actualización de entidad

La actualización de inserción es una combinación de operaciones de inserción y eliminación. En el contexto de la base de datos de vectores Milvus, la actualización es una operación a nivel de datos. Sobrescribe la entidad existente si el campo especificado existe en la colección, e inserta una nueva entidad si el valor especificado no existe.

El siguiente ejemplo actualiza 3,000 filas de datos generados aleatoriamente como datos de muestra. Al realizar la operación de actualización, es importante tener en cuenta que esta operación puede afectar el rendimiento porque implica la eliminación de datos.

Preparar datos

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

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

import random
nb = 3000
dim = 8
vectores = [[random.random() for _ in range(dim)] for _ in range(nb)]
datos = [
    [i for i in range(nb)],
    [str(i) for i in range(nb)],
    [i for i in range(10000, 10000+nb)],
    vectores,
    [str("dy"*i) for i in range(nb)]
]

Actualizar datos

Actualiza los datos en la colección.

from pymilvus import Collection
colección = Collection("libro")  # Obtiene la colección existente.
mr = colección.upsert(datos)

Eliminar entidad

Milvus admite la eliminación de entidades mediante expresiones booleanas a través de claves primarias.

Preparar Expresión Booleana

Prepara una expresión booleana para filtrar las entidades que se van a eliminar.

Milvus solo admite eliminar entidades con claves primarias específicamente especificadas, lo que se puede lograr utilizando el operador "in". Otros operadores solo se pueden usar en filtrado escalar para consultas o búsquedas vectoriales.

El siguiente ejemplo filtra datos utilizando los valores de la clave primaria 0 y 1.

expr = "book_id in [0,1]"

Similar a la declaración de la cláusula WHERE en SQL

Eliminar Entidad

Utiliza la expresión booleana que creaste para eliminar entidades. Milvus devolverá la lista de IDs de las entidades que se eliminaron.

from pymilvus import Collection
collection = Collection("book")      # Obtener la colección existente.
collection.delete(expr)

Compactar Datos

Milvus admite compresión automática de datos de forma predeterminada. Puedes configurar Milvus para habilitar o deshabilitar la compresión automática.

Si la compresión automática está deshabilitada, aún puedes comprimir datos manualmente.

Comprimir Datos Manualmente

Dado que la compresión suele llevar mucho tiempo, las solicitudes de compresión se procesan de forma asincrónica.

from pymilvus import Collection
collection = Collection("book")      # Obtener la colección existente.
collection.compact()

Verificar Estado de Compresión

Puedes utilizar la ID de compresión devuelta al desencadenar la compresión manual para verificar el estado de la compresión.

collection.get_compaction_state()