Penjelasan Skema
Skema mendefinisikan struktur data dari sebuah koleksi. Sebelum membuat koleksi, Anda perlu merancang skema koleksi tersebut. Halaman ini membantu Anda memahami skema koleksi dan merancang contoh skema sendiri.
Gambaran Umum
Di Milvus, skema koleksi menyusun tabel dalam basis data relasional, yang menentukan cara Milvus mengatur data dalam koleksi tersebut.
Skema yang dirancang dengan baik sangat penting karena mengabstraksikan model data dan menentukan apakah Anda dapat mencapai tujuan bisnis melalui pencarian. Selain itu, karena setiap baris data yang dimasukkan ke dalam koleksi harus mengikuti skema, hal ini membantu menjaga konsistensi data dan kualitas jangka panjang. Dari sudut pandang teknis, skema yang didefinisikan dengan baik menghasilkan penyimpanan data kolom yang terorganisir dengan baik dan struktur indeks yang lebih rapi, sehingga meningkatkan kinerja pencarian.
Skema koleksi memiliki kunci utama, setidaknya satu bidang vektor, dan beberapa bidang skalar. Diagram berikut menggambarkan cara memetakan sebuah artikel ke daftar bidang skema.
Anatomi Desain Skema
Desain model data sistem pencarian melibatkan analisis kebutuhan bisnis dan abstraksi informasi ke dalam model data yang diekspresikan melalui skema. Misalnya, pencarian teks harus “diindeks” dengan mengubah string literal menjadi vektor melalui “embedding” dan mengaktifkan pencarian vektor. Selain persyaratan esensial ini, penyimpanan properti lain seperti cap waktu publikasi dan nama penulis mungkin diperlukan. Metadata ini memungkinkan pencarian semantik disempurnakan melalui penyaringan, sehingga hanya menampilkan teks yang diterbitkan setelah tanggal tertentu atau oleh penulis tertentu. Anda juga dapat mengambil skalar-skalar ini bersama teks utama untuk menampilkan hasil pencarian di aplikasi. Masing-masing harus diberi pengenal unik untuk mengatur potongan-potongan teks ini, yang diekspresikan sebagai bilangan bulat atau string. Elemen-elemen ini sangat penting untuk mewujudkan logika pencarian yang canggih.
Lihat Panduan Praktis Desain Skema untuk mengetahui cara membuat skema yang dirancang dengan baik.
Membuat Skema
Potongan kode berikut menunjukkan cara membuat skema.
from pymilvus import MilvusClient, DataType
schema = MilvusClient.create_schema()
import io.milvus.v2.service.collection.request.CreateCollectionReq;
CreateCollectionReq.CollectionSchema schema = client.createSchema();
import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";
const schema = []
import "github.com/milvus-io/milvus/client/v2/entity"
schema := entity.NewSchema()
export schema='{
"fields": []
}'
Tambahkan Bidang Utama
Kolom utama dalam sebuah koleksi mengidentifikasi suatu entitas secara unik. Kolom ini hanya menerima nilai Int64 atau VARCHAR. Potongan kode berikut ini menunjukkan cara menambahkan kolom utama.
schema.add_field(
field_name="my_id",
datatype=DataType.INT64,
is_primary=True,
auto_id=False,
)
import io.milvus.v2.common.DataType;
import io.milvus.v2.service.collection.request.AddFieldReq;
schema.addField(AddFieldReq.builder()
.fieldName("my_id")
.dataType(DataType.Int64)
.isPrimaryKey(true)
.autoID(false)
.build());
schema.push({
name: "my_id",
data_type: DataType.Int64,
is_primary_key: true,
autoID: false
});
schema.WithField(entity.NewField().WithName("my_id").
WithDataType(entity.FieldTypeInt64).
WithIsPrimaryKey(true).
WithIsAutoID(false),
)
export primaryField='{
"fieldName": "my_id",
"dataType": "Int64",
"isPrimary": true
}'
export schema='{
\"autoID\": false,
\"fields\": [
$primaryField
]
}'
Saat menambahkan bidang, Anda dapat secara eksplisit menetapkan bidang tersebut sebagai bidang utama dengan mengatur properti ` is_primary `-nya menjadi ` True`. Bidang utama secara default menerima nilai Int64. Dalam hal ini, nilai bidang utama harus berupa bilangan bulat seperti ` 12345`. Jika Anda memilih menggunakan nilai VARCHAR pada bidang utama, nilainya harus berupa string seperti ` my_entity_1234`.
Anda juga dapat mengatur properti ` autoId ` ke ` True ` agar Milvus secara otomatis mengalokasikan nilai bidang utama saat penyisipan data.
Anda disarankan untuk mengandalkan " autoId " dalam semua kasus, kecuali jika pengaturan kunci utama secara manual memberikan manfaat.
Untuk detailnya, lihat Bidang Utama & AutoId.
Menambahkan Bidang Vektor
Bidang vektor mendukung berbagai representasi vektor yang jarang (sparse) dan padat (dense). Di Milvus, Anda dapat menambahkan empat bidang vektor ke dalam sebuah koleksi. Potongan kode berikut menunjukkan cara menambahkan bidang vektor.
schema.add_field(
field_name="my_vector",
datatype=DataType.FLOAT_VECTOR,
dim=5
)
schema.addField(AddFieldReq.builder()
.fieldName("my_vector")
.dataType(DataType.FloatVector)
.dimension(5)
.build());
schema.push({
name: "my_vector",
data_type: DataType.FloatVector,
dim: 5
});
schema.WithField(entity.NewField().WithName("my_vector").
WithDataType(entity.FieldTypeFloatVector).
WithDim(5),
)
export vectorField='{
"fieldName": "my_vector",
"dataType": "FloatVector",
"elementTypeParams": {
"dim": 5
}
}'
export schema="{
\"autoID\": false,
\"fields\": [
$primaryField,
$vectorField
]
}"
Parameter ` dim ` dalam potongan kode di atas menunjukkan dimensi embedding vektor yang akan disimpan dalam bidang vektor. Nilai ` FLOAT_VECTOR ` menunjukkan bahwa bidang vektor tersebut menyimpan daftar bilangan floating-point 32-bit, yang biasanya digunakan untuk mewakili antilogaritma. Selain itu, Milvus juga mendukung jenis-jenis embedding vektor berikut:
FLOAT16_VECTORBidang vektor jenis ini menyimpan daftar bilangan floating-point presisi setengah 16-bit dan biasanya diterapkan pada skenario pembelajaran mendalam atau komputasi berbasis GPU yang memiliki keterbatasan memori atau bandwidth.
BFLOAT16_VECTORBidang vektor jenis ini berisi daftar bilangan floating-point 16-bit yang memiliki presisi lebih rendah tetapi rentang eksponen yang sama dengan Float32. Jenis data ini umumnya digunakan dalam skenario deep learning, karena dapat mengurangi penggunaan memori tanpa secara signifikan memengaruhi akurasi.
INT8_VECTORVektor jenis ini menyimpan vektor yang terdiri dari bilangan bulat bertanda 8-bit (int8), dengan setiap komponen berkisar antara –128 hingga 127. Dirancang khusus untuk arsitektur deep learning terkuantisasi—seperti ResNet dan EfficientNet—jenis ini secara substansial memperkecil ukuran model dan meningkatkan kecepatan inferensi, sambil hanya menimbulkan kehilangan presisi yang minimal. Catatan: Jenis vektor ini hanya didukung untuk indeks HNSW.
BINARY_VECTORBidang vektor jenis ini menyimpan daftar angka 0 dan 1. Angka-angka tersebut berfungsi sebagai fitur ringkas untuk merepresentasikan data dalam skenario pemrosesan gambar dan pencarian informasi.
SPARSE_FLOAT_VECTORBidang vektor jenis ini menyimpan daftar angka bukan nol dan nomor urutnya untuk merepresentasikan embedding vektor yang jarang.
Menambahkan Bidang Skalar
Dalam kasus umum, Anda dapat menggunakan bidang skalar untuk menyimpan metadata dari embedding vektor yang disimpan di Milvus, dan melakukan pencarian ANN dengan penyaringan metadata untuk meningkatkan keakuratan hasil pencarian. Milvus mendukung berbagai jenis bidang skalar, termasuk VARCHAR, Boolean, Int, Float, dan Double.
Menambahkan Bidang VARCHAR
Di Milvus, Anda dapat menggunakan bidang VARCHAR untuk menyimpan string. Untuk informasi lebih lanjut mengenai bidang VARCHAR, lihat Bidang VarChar.
schema.add_field(
field_name="my_varchar",
datatype=DataType.VARCHAR,
max_length=512
)
schema.addField(AddFieldReq.builder()
.fieldName("my_varchar")
.dataType(DataType.VarChar)
.maxLength(512)
.build());
schema.push({
name: "my_varchar",
data_type: DataType.VarChar,
max_length: 512
});
schema.WithField(entity.NewField().WithName("my_varchar").
WithDataType(entity.FieldTypeVarChar).
WithMaxLength(512),
)
export varCharField='{
"fieldName": "my_varchar",
"dataType": "VarChar",
"elementTypeParams": {
"max_length": 512
}
}'
export schema="{
\"autoID\": false,
\"fields\": [
$primaryField,
$vectorField,
$varCharField
]
}"
Menambahkan Bidang Bilangan
Jenis bilangan yang didukung oleh Milvus adalah Int8, Int16, Int32, Int64, Float, dan Double. Untuk informasi lebih lanjut mengenai bidang bilangan, lihat Bidang Bilangan.
schema.add_field(
field_name="my_int64",
datatype=DataType.INT64,
)
schema.addField(AddFieldReq.builder()
.fieldName("my_int64")
.dataType(DataType.Int64)
.build());
schema.push({
name: "my_int64",
data_type: DataType.Int64,
});
schema.WithField(entity.NewField().WithName("my_int64").
WithDataType(entity.FieldTypeInt64),
)
export int64Field='{
"fieldName": "my_int64",
"dataType": "Int64"
}'
export schema="{
\"autoID\": false,
\"fields\": [
$primaryField,
$vectorField,
$varCharField,
$int64Field
]
}"
Menambahkan Bidang Boolean
Milvus mendukung bidang boolean. Potongan kode berikut menunjukkan cara menambahkan bidang boolean.
schema.add_field(
field_name="my_bool",
datatype=DataType.BOOL,
)
schema.addField(AddFieldReq.builder()
.fieldName("my_bool")
.dataType(DataType.Bool)
.build());
schema.push({
name: "my_bool",
data_type: DataType.Boolean,
});
schema.WithField(entity.NewField().WithName("my_bool").
WithDataType(entity.FieldTypeBool),
)
export boolField='{
"fieldName": "my_bool",
"dataType": "Boolean"
}'
export schema="{
\"autoID\": false,
\"fields\": [
$primaryField,
$vectorField,
$varCharField,
$int64Field,
$boolField
]
}"
Menambahkan Bidang Komposit
Di Milvus, bidang komposit adalah bidang yang dapat dibagi menjadi sub-bidang yang lebih kecil, seperti kunci dalam bidang JSON atau indeks dalam bidang Array.
Menambahkan Bidang JSON
Bidang JSON biasanya menyimpan data JSON semi-terstruktur. Untuk informasi lebih lanjut mengenai bidang JSON, lihat Bidang JSON.
schema.add_field(
field_name="my_json",
datatype=DataType.JSON,
)
schema.addField(AddFieldReq.builder()
.fieldName("my_json")
.dataType(DataType.JSON)
.build());
schema.push({
name: "my_json",
data_type: DataType.JSON,
});
schema.WithField(entity.NewField().WithName("my_json").
WithDataType(entity.FieldTypeJSON),
)
export jsonField='{
"fieldName": "my_json",
"dataType": "JSON"
}'
export schema="{
\"autoID\": false,
\"fields\": [
$primaryField,
$vectorField,
$varCharField,
$int64Field,
$boolField,
$jsonField
]
}"
Tambahkan Bidang Array
Bidang array menyimpan daftar elemen. Tipe data semua elemen dalam bidang array harus sama. Untuk informasi lebih lanjut tentang bidang array, lihat Bidang Array.
schema.add_field(
field_name="my_array",
datatype=DataType.ARRAY,
element_type=DataType.VARCHAR,
max_capacity=5,
max_length=512,
)
schema.addField(AddFieldReq.builder()
.fieldName("my_array")
.dataType(DataType.Array)
.elementType(DataType.VarChar)
.maxCapacity(5)
.maxLength(512)
.build());
schema.push({
name: "my_array",
data_type: DataType.Array,
element_type: DataType.VarChar,
max_capacity: 5,
max_length: 512
});
schema.WithField(entity.NewField().WithName("my_array").
WithDataType(entity.FieldTypeArray).
WithElementType(entity.FieldTypeInt64).
WithMaxLength(512).
WithMaxCapacity(5),
)
export arrayField='{
"fieldName": "my_array",
"dataType": "Array",
"elementDataType": "VarChar",
"elementTypeParams": {
"max_length": 512
}
}'
export schema="{
\"autoID\": false,
\"fields\": [
$primaryField,
$vectorField,
$varCharField,
$int64Field,
$boolField,
$jsonField,
$arrayField
]
}"