Campo primario y AutoID
Cada colección en Milvus debe tener un campo primario para identificar de forma única a cada entidad. Este campo asegura que cada entidad pueda ser insertada, actualizada, consultada o eliminada sin ambigüedad.
Dependiendo de su caso de uso, puede dejar que Milvus genere automáticamente IDs (AutoID) o asignar sus propios IDs manualmente.
¿Qué es un campo primario?
Un campo primario actúa como clave única para cada entidad de una colección, de forma similar a una clave primaria en una base de datos tradicional. Milvus utiliza el campo primario para gestionar las entidades durante las operaciones de inserción, inserción ascendente, eliminación y consulta.
Requisitos de la clave:
Cada colección debe tener exactamente un campo primario.
Los valores del campo primario no pueden ser nulos.
El tipo de datos debe especificarse en el momento de la creación y no puede modificarse posteriormente.
Tipos de datos admitidos
El campo primario debe utilizar un tipo de datos escalar compatible que pueda identificar entidades de forma exclusiva.
Tipo de datos |
Descripción |
|---|---|
|
Tipo entero de 64 bits, utilizado habitualmente con AutoID. Es la opción recomendada para la mayoría de los casos de uso. |
|
Tipo de cadena de longitud variable. Utilícelo cuando los identificadores de entidad procedan de sistemas externos (por ejemplo, códigos de producto o ID de usuario). Requiere la propiedad |
Elija entre AutoID y Manual IDs
Milvus soporta dos modos para asignar valores de clave primaria.
Modo |
Descripción |
Recomendado para |
|---|---|---|
AutoID |
Milvus genera automáticamente identificadores únicos para entidades insertadas o importadas. |
La mayoría de los escenarios en los que no necesita gestionar IDs manualmente. |
ID Manual |
Usted mismo proporciona identificadores únicos al insertar o importar datos. |
Cuando los ID deben alinearse con sistemas externos o conjuntos de datos preexistentes. |
Si no está seguro de qué modo elegir, empiece con AutoID para una ingestión más sencilla y una unicidad garantizada.
Se aconseja confiar en
autoIden todos los casos, a menos que la configuración manual de claves primarias resulte beneficiosa.
Inicio rápido: Utilizar AutoID
Puede dejar que Milvus se encargue automáticamente de la generación de ID.
Paso 1: Crear una colección con AutoID
Active auto_id=True en la definición de su campo primario. Milvus manejará la generación de ID automáticamente.
from pymilvus import MilvusClient, DataType
client = MilvusClient(uri="http://localhost:19530")
schema = client.create_schema()
# Define primary field with AutoID enabled
schema.add_field(
field_name="id", # Primary field name
is_primary=True,
auto_id=True, # Milvus generates IDs automatically; Defaults to False
datatype=DataType.INT64
)
# Define the other fields
schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=4) # Vector field
schema.add_field(field_name="category", datatype=DataType.VARCHAR, max_length=1000) # Scalar field of the VARCHAR type
# Create the collection
if client.has_collection("demo_autoid"):
client.drop_collection("demo_autoid")
client.create_collection(collection_name="demo_autoid", schema=schema)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.collection.request.AddFieldReq;
import io.milvus.v2.service.collection.request.CreateCollectionReq;
import io.milvus.v2.service.collection.request.DropCollectionReq;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("http://localhost:19530")
.build());
CreateCollectionReq.CollectionSchema collectionSchema = CreateCollectionReq.CollectionSchema.builder()
.build();
collectionSchema.addField(AddFieldReq.builder()
.fieldName("id")
.dataType(DataType.Int64)
.isPrimaryKey(true)
.autoID(true)
.build());
collectionSchema.addField(AddFieldReq.builder()
.fieldName("embedding")
.dataType(DataType.FloatVector)
.dimension(4)
.build());
collectionSchema.addField(AddFieldReq.builder()
.fieldName("category")
.dataType(DataType.VarChar)
.maxLength(1000)
.build());
client.dropCollection(DropCollectionReq.builder()
.collectionName("demo_autoid")
.build());
CreateCollectionReq requestCreate = CreateCollectionReq.builder()
.collectionName("demo_autoid")
.collectionSchema(collectionSchema)
.build();
client.createCollection(requestCreate);
import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";
const client = new MilvusClient({
address: "localhost:19530",
});
// Define schema fields
const schema = [
{
name: "id",
description: "Primary field",
data_type: DataType.Int64,
is_primary_key: true,
autoID: true, // Milvus generates IDs automatically
},
{
name: "embedding",
description: "Vector field",
data_type: DataType.FloatVector,
dim: 4,
},
{
name: "category",
description: "Scalar field",
data_type: DataType.VarChar,
max_length: 1000,
},
];
// Create the collection
await client.createCollection({
collection_name: "demo_autoid",
fields: schema,
});
// go
# restful
export SCHEMA='{
"autoID": true,
"fields": [
{
"fieldName": "id",
"dataType": "Int64",
"isPrimary": true,
"elementTypeParams": {}
},
{
"fieldName": "embedding",
"dataType": "FloatVector",
"isPrimary": false,
"elementTypeParams": {
"dim": "4"
}
},
{
"fieldName": "category",
"dataType": "VarChar",
"isPrimary": false,
"elementTypeParams": {
"max_length": "1000"
}
}
]
}'
curl -X POST 'http://localhost:19530/v2/vectordb/collections/create' \
-H 'Content-Type: application/json' \
-H 'Request-Timeout: 10' \
-d "{
\"collectionName\": \"demo_autoid\",
\"schema\": $SCHEMA
}"
Paso 2: Insertar Datos
Importante: No incluya la columna del campo primario en sus datos. Milvus genera IDs automáticamente.
data = [
{"embedding": [0.1, 0.2, 0.3, 0.4], "category": "book"},
{"embedding": [0.2, 0.3, 0.4, 0.5], "category": "toy"},
]
res = client.insert(collection_name="demo_autoid", data=data)
print("Generated IDs:", res.get("ids"))
# Output example:
# Generated IDs: [461526052788333649, 461526052788333650]
import com.google.gson.*;
import io.milvus.v2.service.vector.request.InsertReq;
import io.milvus.v2.service.vector.response.InsertResp;
List<JsonObject> rows = new ArrayList<>();
Gson gson = new Gson();
JsonObject row1 = new JsonObject();
row1.add("embedding", gson.toJsonTree(new float[]{0.1f, 0.2f, 0.3f, 0.4f}));
row1.addProperty("category", "book");
rows.add(row1);
JsonObject row2 = new JsonObject();
row2.add("embedding", gson.toJsonTree(new float[]{0.2f, 0.3f, 0.4f, 0.5f}));
row2.addProperty("category", "toy");
rows.add(row2);
InsertResp insertR = client.insert(InsertReq.builder()
.collectionName("demo_autoid")
.data(rows)
.build());
System.out.printf("Generated IDs: %s\n", insertR.getPrimaryKeys());
const data = [
{"embedding": [0.1, 0.2, 0.3, 0.4], "category": "book"},
{"embedding": [0.2, 0.3, 0.4, 0.5], "category": "toy"},
];
const res = await client.insert({
collection_name: "demo_autoid",
fields_data: data,
});
console.log(res);
// go
# restful
export INSERT_DATA='[
{
"embedding": [0.1, 0.2, 0.3, 0.4],
"category": "book"
},
{
"embedding": [0.2, 0.3, 0.4, 0.5],
"category": "toy"
}
]'
curl -X POST 'http://localhost:19530/v2/vectordb/entities/insert' \
-H 'Content-Type: application/json' \
-H 'Request-Timeout: 10' \
-d "{
\"collectionName\": \"demo_autoid\",
\"data\": $INSERT_DATA
}"
Utilice upsert() en lugar de insert() cuando trabaje con entidades existentes para evitar errores de ID duplicados.
Utilice IDs manuales
Si necesitas controlar los IDs manualmente, desactiva AutoID y proporciona tus propios valores.
Paso 1: Crear una colección sin AutoID
from pymilvus import MilvusClient, DataType
client = MilvusClient(uri="http://localhost:19530")
schema = client.create_schema()
# Define the primary field without AutoID
schema.add_field(
field_name="product_id",
is_primary=True,
auto_id=False, # You'll provide IDs manually at data ingestion
datatype=DataType.VARCHAR,
max_length=100 # Required when datatype is VARCHAR
)
# Define the other fields
schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=4) # Vector field
schema.add_field(field_name="category", datatype=DataType.VARCHAR, max_length=1000) # Scalar field of the VARCHAR type
# Create the collection
if client.has_collection("demo_manual_ids"):
client.drop_collection("demo_manual_ids")
client.create_collection(collection_name="demo_manual_ids", schema=schema)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.collection.request.AddFieldReq;
import io.milvus.v2.service.collection.request.CreateCollectionReq;
import io.milvus.v2.service.collection.request.DropCollectionReq;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("http://localhost:19530")
.build());
CreateCollectionReq.CollectionSchema collectionSchema = CreateCollectionReq.CollectionSchema.builder()
.build();
collectionSchema.addField(AddFieldReq.builder()
.fieldName("product_id")
.dataType(DataType.VarChar)
.isPrimaryKey(true)
.autoID(false)
.maxLength(100)
.build());
collectionSchema.addField(AddFieldReq.builder()
.fieldName("embedding")
.dataType(DataType.FloatVector)
.dimension(4)
.build());
collectionSchema.addField(AddFieldReq.builder()
.fieldName("category")
.dataType(DataType.VarChar)
.maxLength(1000)
.build());
client.dropCollection(DropCollectionReq.builder()
.collectionName("demo_manual_ids")
.build());
CreateCollectionReq requestCreate = CreateCollectionReq.builder()
.collectionName("demo_manual_ids")
.collectionSchema(collectionSchema)
.build();
client.createCollection(requestCreate);
import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";
const client = new MilvusClient({
address: "localhost:19530",
username: "username",
password: "Aa12345!!",
});
const schema = [
{
name: "product_id",
data_type: DataType.VARCHAR,
is_primary_key: true,
autoID: false,
},
{
name: "embedding",
data_type: DataType.FLOAT_VECTOR,
dim: 4,
},
{
name: "category",
data_type: DataType.VARCHAR,
max_length: 1000,
},
];
const res = await client.createCollection({
collection_name: "demo_autoid",
schema: schema,
});
// go
# restful
export SCHEMA='{
"autoID": false,
"fields": [
{
"fieldName": "product_id",
"dataType": "VarChar",
"isPrimary": true,
"elementTypeParams": {
"max_length": "100"
}
},
{
"fieldName": "embedding",
"dataType": "FloatVector",
"isPrimary": false,
"elementTypeParams": {
"dim": "4"
}
},
{
"fieldName": "category",
"dataType": "VarChar",
"isPrimary": false,
"elementTypeParams": {
"max_length": "1000"
}
}
]
}'
curl -X POST 'http://localhost:19530/v2/vectordb/collections/create' \
-H 'Content-Type: application/json' \
-H 'Request-Timeout: 10' \
-d "{
\"collectionName\": \"demo_manual_ids\",
\"schema\": $SCHEMA
}"
Paso 2: Inserte datos con sus IDs
Debes incluir la columna del campo primario en cada operación de inserción.
# Each entity must contain the primary field `product_id`
data = [
{"product_id": "PROD-001", "embedding": [0.1, 0.2, 0.3, 0.4], "category": "book"},
{"product_id": "PROD-002", "embedding": [0.2, 0.3, 0.4, 0.5], "category": "toy"},
]
res = client.insert(collection_name="demo_manual_ids", data=data)
print("Generated IDs:", res.get("ids"))
# Output example:
# Generated IDs: ['PROD-001', 'PROD-002']
import com.google.gson.*;
import io.milvus.v2.service.vector.request.InsertReq;
import io.milvus.v2.service.vector.response.InsertResp;
List<JsonObject> rows = new ArrayList<>();
Gson gson = new Gson();
JsonObject row1 = new JsonObject();
row1.addProperty("product_id", "PROD-001");
row1.add("embedding", gson.toJsonTree(new float[]{0.1f, 0.2f, 0.3f, 0.4f}));
row1.addProperty("category", "book");
rows.add(row1);
JsonObject row2 = new JsonObject();
row2.addProperty("product_id", "PROD-002");
row2.add("embedding", gson.toJsonTree(new float[]{0.2f, 0.3f, 0.4f, 0.5f}));
row2.addProperty("category", "toy");
rows.add(row2);
InsertResp insertR = client.insert(InsertReq.builder()
.collectionName("demo_manual_ids")
.data(rows)
.build());
System.out.printf("Generated IDs: %s\n", insertR.getPrimaryKeys());
const data = [
{"product_id": "PROD-001", "embedding": [0.1, 0.2, 0.3, 0.4], "category": "book"},
{"product_id": "PROD-002", "embedding": [0.2, 0.3, 0.4, 0.5], "category": "toy"},
];
const insert = await client.insert({
collection_name: "demo_autoid",
fields_data: data,
});
console.log(insert);
// go
# restful
export INSERT_DATA='[
{
"product_id": "PROD-001",
"embedding": [0.1, 0.2, 0.3, 0.4],
"category": "book"
},
{
"product_id": "PROD-002",
"embedding": [0.2, 0.3, 0.4, 0.5],
"category": "toy"
}
]'
# 插入数据
curl -X POST 'http://localhost:19530/v2/vectordb/entities/insert' \
-H 'Content-Type: application/json' \
-H 'Request-Timeout: 10' \
-d "{
\"collectionName\": \"demo_manual_ids\",
\"data\": $INSERT_DATA
}"
Sus responsabilidades:
Asegurarte de que todos los IDs son únicos en todas las entidades
Incluir el campo primario en cada operación de inserción/importación
Manejar los conflictos de ID y la detección de duplicados
Uso avanzado
Migrar datos con AutoIDs existentes
Para preservar los IDs existentes durante la migración de datos, habilite la propiedad allow_insert_auto_id haciendo la llamada alter_collection_properties. Cuando se establece en true, Milvus acepta los IDs proporcionados por el usuario incluso si AutoID está habilitado.
Para más detalles sobre la configuración, consulte Modificar colección.
Asegurar la unicidad global de AutoID entre clusters
Cuando ejecute múltiples clusters Milvus, configure un ID de cluster único para cada uno para asegurar que los AutoIDs nunca se superpongan.
Configuración: Edite la configuración common.clusterID en milvus.yaml antes de inicializar su cluster:
common:
clusterID: 3 # Must be unique across all clusters (Range: 0-7)
En esta configuración, clusterID especifica el identificador único utilizado en la generación de AutoID, que va de 0 a 7 (soporta hasta ocho clusters).
Milvus maneja la inversión de bits internamente para permitir futuras expansiones sin solapamiento de ID. No se necesita configuración manual más allá de establecer el ID del cluster.
Referencia: Cómo funciona AutoID
Comprender cómo AutoID genera internamente identificadores únicos puede ayudarle a configurar correctamente los ID de clúster y a solucionar problemas relacionados con los ID.
AutoID utiliza un formato estructurado de 64 bits para garantizar la unicidad:
[sign_bit][cluster_id][physical_ts][logical_ts]
Segmento |
Descripción |
|---|---|
|
Reservado para uso interno |
|
Identifica qué clúster generó el ID (rango de valores: 0-7) |
|
Marca de tiempo en milisegundos cuando se generó el ID |
|
Contador para distinguir los ID creados en el mismo milisegundo |
Incluso cuando AutoID está activado con VARCHAR como tipo de datos, Milvus sigue generando ID numéricos. Éstos se almacenan como cadenas numéricas con una longitud máxima de 20 caracteres (rango uint64).