Penjelasan Skema
Skema mendefinisikan struktur data koleksi. Sebelum membuat koleksi, Anda perlu membuat desain skemanya. 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 mendefinisikan bagaimana Milvus mengatur data di dalam koleksi.
Skema yang dirancang dengan baik sangat penting karena skema ini mengabstraksikan model data dan memutuskan 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 perspektif teknis, skema yang terdefinisi dengan baik akan menghasilkan penyimpanan data kolom yang terorganisir dengan baik dan struktur indeks yang lebih bersih, sehingga meningkatkan kinerja pencarian.
Skema koleksi memiliki kunci utama, setidaknya satu bidang vektor, dan beberapa bidang skalar. Diagram berikut ini mengilustrasikan cara memetakan artikel ke daftar bidang skema.
Anatomi Desain Skema
Desain model data dari sistem pencarian melibatkan analisis kebutuhan bisnis dan abstraksi informasi ke dalam model data yang diekspresikan dengan skema. Misalnya, pencarian sepotong teks harus "diindeks" dengan mengubah string literal menjadi vektor melalui "penyematan" dan memungkinkan pencarian vektor. Di luar persyaratan penting ini, menyimpan properti lain seperti stempel waktu publikasi dan penulis mungkin diperlukan. Metadata ini memungkinkan pencarian semantik disempurnakan melalui penyaringan, yang hanya mengembalikan teks yang diterbitkan setelah tanggal tertentu atau oleh penulis tertentu. Anda juga dapat mengambil skalar ini dengan teks utama untuk merender hasil pencarian dalam aplikasi. Masing-masing harus diberi pengenal unik untuk mengatur potongan-potongan teks ini, yang dinyatakan sebagai bilangan bulat atau string. Elemen-elemen ini sangat penting untuk mencapai logika pencarian yang canggih.
Lihat Panduan Praktis Desain Skema untuk mengetahui cara membuat skema yang dirancang dengan baik.
Membuat Skema
Cuplikan kode berikut ini 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": []
}'
Menambahkan Field Utama
Bidang utama dalam koleksi mengidentifikasi entitas secara unik. Field ini hanya menerima nilai Int64 atau VarChar. Cuplikan kode berikut ini menunjukkan cara menambahkan field 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
]
}'
Ketika menambahkan sebuah field, Anda dapat secara eksplisit mengklarifikasi field tersebut sebagai field utama dengan menyetel properti is_primary ke True. Bidang utama menerima nilai Int64 secara default. Dalam kasus ini, nilai field utama harus berupa bilangan bulat yang mirip dengan 12345. Jika Anda memilih untuk menggunakan nilai VarChar di field utama, nilainya harus berupa string yang mirip dengan my_entity_1234.
Anda juga dapat mengatur properti autoId ke True untuk membuat Milvus secara otomatis mengalokasikan nilai field utama pada saat penyisipan data.
Anda disarankan untuk menggunakan autoId dalam semua kasus kecuali jika pengaturan kunci primer secara manual bermanfaat.
Untuk detailnya, lihat Field Utama & AutoId.
Menambahkan Bidang Vektor
Bidang vektor menerima berbagai penyematan vektor yang jarang dan padat. Di Milvus, Anda dapat menambahkan empat bidang vektor ke sebuah koleksi. Cuplikan kode berikut ini menunjukkan bagaimana 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 pada potongan kode di atas menunjukkan dimensi embedding vektor yang akan ditampung di bidang vektor. Nilai FLOAT_VECTOR menunjukkan bahwa bidang vektor menyimpan daftar angka mengambang 32-bit, yang biasanya digunakan untuk merepresentasikan antilogaritma, Selain itu, Milvus juga mendukung jenis-jenis penyematan vektor berikut ini:
FLOAT16_VECTORBidang vektor jenis ini menyimpan daftar bilangan mengambang setengah presisi 16-bit dan biasanya berlaku untuk skenario pembelajaran mendalam atau komputasi berbasis GPU yang dibatasi memori atau bandwidth.
BFLOAT16_VECTORBidang vektor jenis ini menyimpan daftar angka floating-point 16-bit yang memiliki presisi lebih rendah namun memiliki rentang eksponen yang sama dengan Float32. Jenis data ini biasanya digunakan dalam skenario pembelajaran mendalam, karena mengurangi penggunaan memori tanpa memengaruhi akurasi secara signifikan.
INT8_VECTORBidang vektor jenis ini menyimpan vektor yang terdiri dari bilangan bulat bertanda 8-bit (int8), dengan setiap komponen berkisar antara -128 hingga 127. Didesain untuk arsitektur pembelajaran mendalam yang terkuantisasi-seperti ResNet dan EfficientNet-secara substansial mengecilkan ukuran model dan meningkatkan kecepatan inferensi, namun dengan kehilangan presisi yang minimal. Catatan: Jenis vektor ini hanya didukung untuk indeks HNSW.
BINARY_VECTORBidang vektor jenis ini menyimpan daftar 0 dan 1. Mereka berfungsi sebagai fitur ringkas untuk merepresentasikan data dalam pemrosesan gambar dan skenario pengambilan informasi.
SPARSE_FLOAT_VECTORBidang vektor jenis ini menyimpan daftar angka bukan nol dan nomor urutnya untuk merepresentasikan penyematan vektor yang jarang.
Menambahkan Bidang Skalar
Dalam kasus yang umum, Anda dapat menggunakan bidang skalar untuk menyimpan metadata dari sematan vektor yang disimpan di Milvus, dan melakukan pencarian JST dengan pemfilteran metadata untuk meningkatkan ketepatan hasil pencarian. Milvus mendukung beberapa jenis bidang skalar, termasuk VarChar, Boolean, Int, Float, dan Double.
Menambahkan Bidang String
Di Milvus, Anda dapat menggunakan field VarChar untuk menyimpan string. Untuk mengetahui lebih lanjut tentang bidang VarChar, lihat Bidang String.
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 Angka
Jenis-jenis angka yang didukung Milvus adalah Int8, Int16, Int32, Int64, Float, dan Double. Untuk informasi lebih lanjut tentang bidang angka, lihat Bidang Angka.
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. Cuplikan kode berikut ini mendemonstrasikan cara menambahkan field 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 subbidang yang lebih kecil, seperti kunci dalam bidang JSON atau indeks dalam bidang Larik.
Menambahkan bidang JSON
Bidang JSON biasanya menyimpan data JSON setengah terstruktur. Untuk mengetahui lebih lanjut tentang 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
]
}"
Menambahkan Bidang Array
Bidang array menyimpan daftar elemen. Tipe data dari semua elemen di dalam bidang array harus sama. Untuk mengetahui 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
]
}"