Membuat Koleksi
Anda dapat membuat koleksi dengan menentukan skema, parameter indeks, jenis metrik, dan apakah akan dimuat pada saat pembuatan. Halaman ini memperkenalkan cara membuat koleksi dari awal.
Gambaran Umum
Koleksi adalah tabel dua dimensi dengan kolom tetap dan baris varian. Setiap kolom mewakili sebuah field, dan setiap baris mewakili sebuah entitas. Sebuah skema diperlukan untuk mengimplementasikan manajemen data struktural tersebut. Setiap entitas yang akan disisipkan harus memenuhi batasan yang ditentukan dalam skema.
Anda dapat menentukan setiap aspek koleksi, termasuk skema, parameter indeks, jenis metrik, dan apakah akan dimuat pada saat pembuatan untuk memastikan bahwa koleksi tersebut sepenuhnya memenuhi kebutuhan Anda.
Untuk membuat koleksi, Anda perlu
Membuat Skema
Skema mendefinisikan struktur data koleksi. Saat membuat koleksi, Anda perlu merancang skema berdasarkan kebutuhan Anda. Untuk detailnya, lihat Penjelasan Skema.
Cuplikan kode berikut ini membuat skema dengan bidang dinamis yang diaktifkan dan tiga bidang wajib bernama my_id, my_vector, dan my_varchar.
Anda dapat menetapkan nilai default untuk bidang skalar apa pun dan menjadikannya dapat dinihilkan. Untuk detailnya, lihat Nullable & Default.
# 3. Create a collection in customized setup mode
from pymilvus import MilvusClient, DataType
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
# 3.1. Create schema
schema = MilvusClient.create_schema(
auto_id=False,
enable_dynamic_field=True,
)
# 3.2. Add fields to schema
schema.add_field(field_name="my_id", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="my_vector", datatype=DataType.FLOAT_VECTOR, dim=5)
schema.add_field(field_name="my_varchar", datatype=DataType.VARCHAR, max_length=512)
import io.milvus.v2.common.DataType;
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;
String CLUSTER_ENDPOINT = "http://localhost:19530";
String TOKEN = "root:Milvus";
// 1. Connect to Milvus server
ConnectConfig connectConfig = ConnectConfig.builder()
.uri(CLUSTER_ENDPOINT)
.token(TOKEN)
.build();
MilvusClientV2 client = new MilvusClientV2(connectConfig);
// 3. Create a collection in customized setup mode
// 3.1 Create schema
CreateCollectionReq.CollectionSchema schema = client.createSchema();
// 3.2 Add fields to schema
schema.addField(AddFieldReq.builder()
.fieldName("my_id")
.dataType(DataType.Int64)
.isPrimaryKey(true)
.autoID(false)
.build());
schema.addField(AddFieldReq.builder()
.fieldName("my_vector")
.dataType(DataType.FloatVector)
.dimension(5)
.build());
schema.addField(AddFieldReq.builder()
.fieldName("my_varchar")
.dataType(DataType.VarChar)
.maxLength(512)
.build());
import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";
const address = "http://localhost:19530";
const token = "root:Milvus";
const client = new MilvusClient({address, token});
// 3. Create a collection in customized setup mode
// 3.1 Define fields
const fields = [
{
name: "my_id",
data_type: DataType.Int64,
is_primary_key: true,
auto_id: false
},
{
name: "my_vector",
data_type: DataType.FloatVector,
dim: 5
},
{
name: "my_varchar",
data_type: DataType.VarChar,
max_length: 512
}
]
import (
"context"
"fmt"
"github.com/milvus-io/milvus/client/v2/entity"
"github.com/milvus-io/milvus/client/v2/index"
"github.com/milvus-io/milvus/client/v2/milvusclient"
"github.com/milvus-io/milvus/pkg/v2/common"
)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
milvusAddr := "localhost:19530"
client, err := milvusclient.New(ctx, &milvusclient.ClientConfig{
Address: milvusAddr,
})
if err != nil {
fmt.Println(err.Error())
// handle error
}
defer client.Close(ctx)
schema := entity.NewSchema().WithDynamicFieldEnabled(true).
WithField(entity.NewField().WithName("my_id").WithIsAutoID(false).WithDataType(entity.FieldTypeInt64).WithIsPrimaryKey(true)).
WithField(entity.NewField().WithName("my_vector").WithDataType(entity.FieldTypeFloatVector).WithDim(5)).
WithField(entity.NewField().WithName("my_varchar").WithDataType(entity.FieldTypeVarChar).WithMaxLength(512))
export schema='{
"autoId": false,
"enabledDynamicField": false,
"fields": [
{
"fieldName": "my_id",
"dataType": "Int64",
"isPrimary": true
},
{
"fieldName": "my_vector",
"dataType": "FloatVector",
"elementTypeParams": {
"dim": "5"
}
},
{
"fieldName": "my_varchar",
"dataType": "VarChar",
"elementTypeParams": {
"max_length": 512
}
}
]
}'
(Opsional) Tetapkan Parameter Indeks
Membuat indeks pada bidang tertentu akan mempercepat pencarian terhadap bidang tersebut. Indeks mencatat urutan entitas dalam koleksi. Seperti yang ditunjukkan pada cuplikan kode berikut ini, Anda dapat menggunakan metric_type dan index_type untuk memilih cara yang tepat bagi Milvus untuk mengindeks sebuah field dan mengukur kemiripan di antara sematan vektor.
Pada Milvus, Anda dapat menggunakan AUTOINDEX sebagai tipe indeks untuk semua bidang vektor, dan salah satu dari COSINE, L2, dan IP sebagai tipe metrik berdasarkan kebutuhan Anda.
Seperti yang ditunjukkan pada cuplikan kode di atas, Anda perlu mengatur jenis indeks dan jenis metrik untuk bidang vektor dan hanya jenis indeks untuk bidang skalar. Indeks wajib untuk bidang vektor, dan Anda disarankan untuk membuat indeks pada bidang skalar yang sering digunakan dalam kondisi pemfilteran.
Untuk detailnya, lihat Bidang Vektor Indeks dan Bidang Skalar Indeks.
# 3.3. Prepare index parameters
index_params = client.prepare_index_params()
# 3.4. Add indexes
index_params.add_index(
field_name="my_id",
index_type="AUTOINDEX"
)
index_params.add_index(
field_name="my_vector",
index_type="AUTOINDEX",
metric_type="COSINE"
)
import io.milvus.v2.common.IndexParam;
import java.util.*;
// 3.3 Prepare index parameters
IndexParam indexParamForIdField = IndexParam.builder()
.fieldName("my_id")
.indexType(IndexParam.IndexType.AUTOINDEX)
.build();
IndexParam indexParamForVectorField = IndexParam.builder()
.fieldName("my_vector")
.indexType(IndexParam.IndexType.AUTOINDEX)
.metricType(IndexParam.MetricType.COSINE)
.build();
List<IndexParam> indexParams = new ArrayList<>();
indexParams.add(indexParamForIdField);
indexParams.add(indexParamForVectorField);
// 3.2 Prepare index parameters
const index_params = [{
field_name: "my_id",
index_type: "AUTOINDEX"
},{
field_name: "my_vector",
index_type: "AUTOINDEX",
metric_type: "COSINE"
}]
import (
"github.com/milvus-io/milvus/client/v2/entity"
"github.com/milvus-io/milvus/client/v2/index"
"github.com/milvus-io/milvus/client/v2/milvusclient"
)
collectionName := "customized_setup_1"
indexOptions := []milvusclient.CreateIndexOption{
milvusclient.NewCreateIndexOption(collectionName, "my_vector", index.NewAutoIndex(entity.COSINE)),
milvusclient.NewCreateIndexOption(collectionName, "my_id", index.NewAutoIndex(entity.COSINE)),
}
export indexParams='[
{
"fieldName": "my_vector",
"metricType": "COSINE",
"indexName": "my_vector",
"indexType": "AUTOINDEX"
},
{
"fieldName": "my_id",
"indexName": "my_id",
"indexType": "AUTOINDEX"
}
]'
Membuat Koleksi
Jika Anda telah membuat koleksi dengan parameter indeks, Milvus secara otomatis memuat koleksi pada saat pembuatannya. Dalam hal ini, semua bidang yang disebutkan dalam parameter indeks diindeks.
Cuplikan kode berikut ini menunjukkan cara membuat koleksi dengan parameter indeks dan memeriksa status pemuatannya.
# 3.5. Create a collection with the index loaded simultaneously
client.create_collection(
collection_name="customized_setup_1",
schema=schema,
index_params=index_params
)
res = client.get_load_state(
collection_name="customized_setup_1"
)
print(res)
# Output
#
# {
# "state": "<LoadState: Loaded>"
# }
import io.milvus.v2.service.collection.request.CreateCollectionReq;
import io.milvus.v2.service.collection.request.GetLoadStateReq;
// 3.4 Create a collection with schema and index parameters
CreateCollectionReq customizedSetupReq1 = CreateCollectionReq.builder()
.collectionName("customized_setup_1")
.collectionSchema(schema)
.indexParams(indexParams)
.build();
client.createCollection(customizedSetupReq1);
// 3.5 Get load state of the collection
GetLoadStateReq customSetupLoadStateReq1 = GetLoadStateReq.builder()
.collectionName("customized_setup_1")
.build();
Boolean loaded = client.getLoadState(customSetupLoadStateReq1);
System.out.println(loaded);
// Output:
// true
// 3.3 Create a collection with fields and index parameters
res = await client.createCollection({
collection_name: "customized_setup_1",
fields: fields,
index_params: index_params,
})
console.log(res.error_code)
// Output
//
// Success
//
res = await client.getLoadState({
collection_name: "customized_setup_1"
})
console.log(res.state)
// Output
//
// LoadStateLoaded
//
err = client.CreateCollection(ctx, milvusclient.NewCreateCollectionOption("customized_setup_1", schema).
WithIndexOptions(indexOptions...))
if err != nil {
fmt.Println(err.Error())
// handle error
}
fmt.Println("collection created")
export CLUSTER_ENDPOINT="http://localhost:19530"
export TOKEN="root:Milvus"
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d "{
\"collectionName\": \"customized_setup_1\",
\"schema\": $schema,
\"indexParams\": $indexParams
}"
Anda juga dapat membuat koleksi tanpa parameter indeks dan menambahkannya setelahnya. Dalam kasus ini, Milvus tidak memuat koleksi pada saat pembuatannya. .
Cuplikan kode berikut ini mendemonstrasikan cara membuat koleksi tanpa indeks, dan status pemuatan koleksi tetap tidak dimuat pada saat pembuatan.
# 3.6. Create a collection and index it separately
client.create_collection(
collection_name="customized_setup_2",
schema=schema,
)
res = client.get_load_state(
collection_name="customized_setup_2"
)
print(res)
# Output
#
# {
# "state": "<LoadState: NotLoad>"
# }
// 3.6 Create a collection and index it separately
CreateCollectionReq customizedSetupReq2 = CreateCollectionReq.builder()
.collectionName("customized_setup_2")
.collectionSchema(schema)
.build();
client.createCollection(customizedSetupReq2);
GetLoadStateReq customSetupLoadStateReq2 = GetLoadStateReq.builder()
.collectionName("customized_setup_2")
.build();
Boolean loaded = client.getLoadState(customSetupLoadStateReq2);
System.out.println(loaded);
// Output:
// false
// 3.4 Create a collection and index it seperately
res = await client.createCollection({
collection_name: "customized_setup_2",
fields: fields,
})
console.log(res.error_code)
// Output
//
// Success
//
res = await client.getLoadState({
collection_name: "customized_setup_2"
})
console.log(res.state)
// Output
//
// LoadStateNotLoad
//
err = client.CreateCollection(ctx, milvusclient.NewCreateCollectionOption("customized_setup_2", schema))
if err != nil {
fmt.Println(err.Error())
// handle error
}
fmt.Println("collection created")
state, err := client.GetLoadState(ctx, milvusclient.NewGetLoadStateOption("customized_setup_2"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
fmt.Println(state.State)
export CLUSTER_ENDPOINT="http://localhost:19530"
export TOKEN="root:Milvus"
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d "{
\"collectionName\": \"customized_setup_2\",
\"schema\": $schema
}"
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d "{
\"collectionName\": \"customized_setup_2\"
}"
Mengatur Properti Koleksi
Anda dapat mengatur properti untuk koleksi yang akan dibuat agar sesuai dengan layanan Anda. Properti yang berlaku adalah sebagai berikut.
Tetapkan Nomor Pecahan
Pecahan adalah irisan horizontal dari sebuah koleksi, dan setiap pecahan berhubungan dengan saluran masukan data. Secara default, setiap koleksi memiliki satu pecahan. Anda dapat menentukan jumlah pecahan saat membuat koleksi agar lebih sesuai dengan volume data dan beban kerja Anda.
Sebagai panduan umum, pertimbangkan hal berikut saat mengatur jumlah pecahan:
- Ukuran data: Praktik yang umum dilakukan adalah memiliki satu pecahan untuk setiap 200 juta entitas. Anda juga dapat memperkirakan berdasarkan ukuran data total, misalnya, menambahkan satu pecahan untuk setiap 100 GB data yang Anda rencanakan untuk dimasukkan.
- Pemanfaatan simpul aliran: Jika instans Milvus Anda memiliki beberapa stream node, disarankan untuk menggunakan beberapa shard. Hal ini memastikan bahwa beban kerja penyisipan data didistribusikan ke seluruh stream node yang tersedia, mencegah beberapa node menganggur sementara yang lain kelebihan beban.
Cuplikan kode berikut ini menunjukkan cara mengatur nomor pecahan ketika Anda membuat koleksi.
# With shard number
client.create_collection(
collection_name="customized_setup_3",
schema=schema,
num_shards=1
)
// With shard number
CreateCollectionReq customizedSetupReq3 = CreateCollectionReq.builder()
.collectionName("customized_setup_3")
.collectionSchema(collectionSchema)
.numShards(1)
.build();
client.createCollection(customizedSetupReq3);
const createCollectionReq = {
collection_name: "customized_setup_3",
schema: schema,
shards_num: 1
}
err = client.CreateCollection(ctx, milvusclient.NewCreateCollectionOption("customized_setup_3", schema).WithShardNum(1))
if err != nil {
fmt.Println(err.Error())
// handle error
}
fmt.Println("collection created")
export params='{
"shardsNum": 1
}'
export CLUSTER_ENDPOINT="http://localhost:19530"
export TOKEN="root:Milvus"
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d "{
\"collectionName\": \"customized_setup_3\",
\"schema\": $schema,
\"params\": $params
}"
Mengaktifkan mmap
Milvus mengaktifkan mmap pada semua koleksi secara default, sehingga Milvus dapat memetakan data lapangan mentah ke dalam memori alih-alih memuatnya secara penuh. Hal ini mengurangi jejak memori dan meningkatkan kapasitas koleksi. Untuk detail tentang mmap, lihat Menggunakan mmap.
# With mmap
client.create_collection(
collection_name="customized_setup_4",
schema=schema,
enable_mmap=False
)
import io.milvus.param.Constant;
// With MMap
CreateCollectionReq customizedSetupReq4 = CreateCollectionReq.builder()
.collectionName("customized_setup_4")
.collectionSchema(schema)
.property(Constant.MMAP_ENABLED, "false")
.build();
client.createCollection(customizedSetupReq4);
client.create_collection({
collection_name: "customized_setup_4",
schema: schema,
properties: {
'mmap.enabled': true,
},
})
err = client.CreateCollection(ctx, milvusclient.NewCreateCollectionOption("customized_setup_4", schema).
WithProperty(common.MmapEnabledKey, true))
if err != nil {
fmt.Println(err.Error())
// handle error
}
fmt.Println("collection created")
export params='{
"mmap.enabled": True
}'
export CLUSTER_ENDPOINT="http://localhost:19530"
export TOKEN="root:Milvus"
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d "{
\"collectionName\": \"customized_setup_5\",
\"schema\": $schema,
\"params\": $params
}"
Mengatur TTL Koleksi
Jika data dalam koleksi perlu dihilangkan selama periode tertentu, pertimbangkan untuk mengatur Time-To-Live (TTL) dalam hitungan detik. Setelah TTL habis, Milvus akan menghapus entitas dalam koleksi. Penghapusan ini bersifat asinkron, yang mengindikasikan bahwa pencarian dan kueri masih mungkin dilakukan sebelum penghapusan selesai.
Cuplikan kode berikut ini mengatur TTL ke satu hari (86400 detik). Anda disarankan untuk menyetel TTL ke beberapa hari minimal.
# With TTL
client.create_collection(
collection_name="customized_setup_5",
schema=schema,
properties={
"collection.ttl.seconds": 86400
}
)
import io.milvus.param.Constant;
// With TTL
CreateCollectionReq customizedSetupReq5 = CreateCollectionReq.builder()
.collectionName("customized_setup_5")
.collectionSchema(schema)
.property(Constant.TTL_SECONDS, "86400")
.build();
client.createCollection(customizedSetupReq5);
const createCollectionReq = {
collection_name: "customized_setup_5",
schema: schema,
properties: {
"collection.ttl.seconds": 86400
}
}
err = client.CreateCollection(ctx, milvusclient.NewCreateCollectionOption("customized_setup_5", schema).
WithProperty(common.CollectionTTLConfigKey, true))
if err != nil {
fmt.Println(err.Error())
// handle error
}
fmt.Println("collection created")
export params='{
"ttlSeconds": 86400
}'
export CLUSTER_ENDPOINT="http://localhost:19530"
export TOKEN="root:Milvus"
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d "{
\"collectionName\": \"customized_setup_5\",
\"schema\": $schema,
\"params\": $params
}"
Mengatur Tingkat Konsistensi
Ketika membuat koleksi, Anda dapat mengatur tingkat konsistensi untuk pencarian dan kueri di dalam koleksi. Anda juga dapat mengubah tingkat konsistensi koleksi selama pencarian atau kueri tertentu.
# With consistency level
client.create_collection(
collection_name="customized_setup_6",
schema=schema,
consistency_level="Bounded",
)
import io.milvus.v2.common.ConsistencyLevel;
// With consistency level
CreateCollectionReq customizedSetupReq6 = CreateCollectionReq.builder()
.collectionName("customized_setup_6")
.collectionSchema(schema)
.consistencyLevel(ConsistencyLevel.BOUNDED)
.build();
client.createCollection(customizedSetupReq6);
const createCollectionReq = {
collection_name: "customized_setup_6",
schema: schema,
consistency_level: "Bounded",
}
client.createCollection(createCollectionReq);
err = client.CreateCollection(ctx, milvusclient.NewCreateCollectionOption("customized_setup_6", schema).
WithConsistencyLevel(entity.ClBounded))
if err != nil {
fmt.Println(err.Error())
// handle error
}
fmt.Println("collection created")
export params='{
"consistencyLevel": "Bounded"
}'
export CLUSTER_ENDPOINT="http://localhost:19530"
export TOKEN="root:Milvus"
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d "{
\"collectionName\": \"customized_setup_6\",
\"schema\": $schema,
\"params\": $params
}"
Untuk mengetahui lebih lanjut tentang tingkat konsistensi, lihat Tingkat Konsistensi.
Mengaktifkan Bidang Dinamis
Bidang dinamis dalam koleksi adalah bidang JavaScript Object Notation (JSON) yang dicadangkan bernama $meta. Setelah Anda mengaktifkan bidang ini, Milvus menyimpan semua bidang yang tidak ditentukan skema yang dibawa dalam setiap entitas dan nilainya sebagai pasangan kunci-nilai dalam bidang yang dicadangkan.
Untuk detail mengenai cara menggunakan bidang dinamis, lihat Bidang Dinamis.