Bidang Utama & AutoID
Setiap koleksi di Milvus harus memiliki field utama untuk mengidentifikasi setiap entitas secara unik. Field ini memastikan bahwa setiap entitas dapat dimasukkan, diperbarui, ditanyakan, atau dihapus tanpa ambiguitas.
Tergantung pada kasus penggunaan Anda, Anda dapat membiarkan Milvus secara otomatis membuat ID (AutoID) atau menetapkan ID Anda sendiri secara manual.
Apa yang dimaksud dengan field utama?
Field utama bertindak sebagai kunci unik untuk setiap entitas dalam koleksi, mirip dengan kunci utama dalam basis data tradisional. Milvus menggunakan field utama untuk mengelola entitas selama operasi penyisipan, penambahan, penghapusan, dan kueri.
Persyaratan utama:
Setiap koleksi harus memiliki satu field utama.
Nilai field utama tidak boleh nol.
Tipe data harus ditentukan pada saat pembuatan dan tidak dapat diubah di kemudian hari.
Tipe data yang didukung
Field utama harus menggunakan tipe data skalar yang didukung yang dapat mengidentifikasi entitas secara unik.
Tipe Data |
Deskripsi |
|---|---|
|
Tipe integer 64-bit, umumnya digunakan dengan AutoID. Ini adalah opsi yang direkomendasikan untuk sebagian besar kasus penggunaan. |
|
Tipe string dengan panjang variabel. Gunakan ini bila pengenal entitas berasal dari sistem eksternal (misalnya, kode produk atau ID pengguna). Memerlukan properti |
Memilih antara ID Otomatis dan ID Manual
Milvus mendukung dua mode untuk menetapkan nilai kunci utama.
Mode |
Deskripsi |
Direkomendasikan untuk |
|---|---|---|
AutoID |
Milvus secara otomatis menghasilkan pengidentifikasi unik untuk entitas yang dimasukkan atau diimpor. |
Sebagian besar skenario di mana Anda tidak perlu mengelola ID secara manual. |
ID Manual |
Anda memberikan ID unik sendiri ketika memasukkan atau mengimpor data. |
Ketika ID harus selaras dengan sistem eksternal atau kumpulan data yang sudah ada sebelumnya. |
Jika Anda tidak yakin mode mana yang harus dipilih, mulailah dengan AutoID untuk memudahkan dan menjamin keunikan.
Anda disarankan untuk mengandalkan
autoIddalam semua kasus kecuali jika pengaturan kunci primer secara manual bermanfaat.
Memulai dengan cepat: Gunakan AutoID
Anda dapat membiarkan Milvus menangani pembuatan ID secara otomatis.
Langkah 1: Membuat koleksi dengan AutoID
Aktifkan auto_id=True di dalam definisi field utama Anda. Milvus akan menangani pembuatan ID secara otomatis.
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
}"
Langkah 2: Memasukkan Data
Penting: Jangan sertakan kolom field utama dalam data Anda. Milvus akan menghasilkan ID secara otomatis.
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
}"
Gunakan upsert() dan bukan insert() ketika bekerja dengan entitas yang sudah ada untuk menghindari kesalahan ID ganda.
Gunakan ID manual
Jika Anda perlu mengontrol ID secara manual, nonaktifkan AutoID dan berikan nilai Anda sendiri.
Langkah 1: Membuat koleksi tanpa 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
}"
Langkah 2: Masukkan data dengan ID Anda
Anda harus menyertakan kolom kolom utama dalam setiap operasi penyisipan.
# 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
}"
Tanggung jawab Anda:
Memastikan semua ID unik di semua entitas
Menyertakan kolom utama dalam setiap operasi penyisipan/impor
Menangani konflik ID dan deteksi duplikat secara mandiri
Penggunaan tingkat lanjut
Memigrasi data dengan ID Otomatis yang sudah ada
Untuk mempertahankan ID yang sudah ada selama migrasi data, aktifkan properti allow_insert_auto_id dengan melakukan panggilan alter_collection_properties. Ketika diatur ke true, Milvus menerima ID yang disediakan pengguna meskipun AutoID diaktifkan.
Untuk detail konfigurasi, lihat Memodifikasi Koleksi.
Memastikan keunikan AutoID global di seluruh cluster
Ketika menjalankan beberapa cluster Milvus, konfigurasikan ID cluster yang unik untuk setiap cluster untuk memastikan AutoID tidak pernah tumpang tindih.
Konfigurasi: Edit konfigurasi common.clusterID di milvus.yaml sebelum menginisialisasi cluster Anda:
common:
clusterID: 3 # Must be unique across all clusters (Range: 0-7)
Dalam konfigurasi ini, clusterID menentukan pengenal unik yang digunakan dalam pembuatan AutoID, mulai dari 0 hingga 7 (mendukung hingga delapan cluster).
Milvus menangani pembalikan bit secara internal untuk memungkinkan perluasan di masa depan tanpa tumpang tindih ID. Tidak ada konfigurasi manual yang diperlukan selain pengaturan ID cluster.
Referensi: Bagaimana AutoID bekerja
Memahami bagaimana AutoID menghasilkan pengidentifikasi unik secara internal dapat membantu Anda mengonfigurasi ID cluster dengan benar dan memecahkan masalah terkait ID.
AutoID menggunakan format 64-bit terstruktur untuk menjamin keunikan:
[sign_bit][cluster_id][physical_ts][logical_ts]
Segmen |
Keterangan |
|---|---|
|
Dicadangkan untuk penggunaan internal |
|
Mengidentifikasi cluster mana yang menghasilkan ID (rentang nilai: 0-7) |
|
Cap waktu dalam milidetik saat ID dibuat |
|
Penghitung untuk membedakan ID yang dibuat dalam milidetik yang sama |
Bahkan ketika AutoID diaktifkan dengan VARCHAR sebagai tipe data, Milvus masih menghasilkan ID numerik. ID ini disimpan sebagai string numerik dengan panjang maksimum 20 karakter (rentang uint64).