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