Gunakan Kunci Partisi
Kunci Partisi adalah solusi pengoptimalan pencarian berdasarkan partisi. Dengan menetapkan bidang skalar tertentu sebagai Kunci Partisi dan menentukan kondisi pemfilteran berdasarkan Kunci Partisi selama pencarian, cakupan pencarian dapat dipersempit menjadi beberapa partisi, sehingga meningkatkan efisiensi pencarian. Artikel ini akan memperkenalkan cara menggunakan Kunci Partisi dan pertimbangan terkait.
Gambaran Umum
Di Milvus, Anda dapat menggunakan partisi untuk mengimplementasikan pemisahan data dan meningkatkan performa pencarian dengan membatasi cakupan pencarian ke partisi tertentu. Jika Anda memilih untuk mengelola partisi secara manual, Anda dapat membuat maksimal 1.024 partisi dalam koleksi, dan menyisipkan entitas ke dalam partisi-partisi ini berdasarkan aturan tertentu sehingga Anda dapat mempersempit cakupan pencarian dengan membatasi pencarian dalam sejumlah partisi tertentu.
Milvus memperkenalkan Kunci Partisi agar Anda dapat menggunakan kembali partisi dalam pemisahan data untuk mengatasi batas jumlah partisi yang dapat Anda buat dalam koleksi. Ketika membuat koleksi, Anda dapat menggunakan bidang skalar sebagai Kunci Partisi. Setelah koleksi siap, Milvus akan membuat sejumlah partisi di dalam koleksi dengan masing-masing partisi yang sesuai dengan rentang nilai dalam Kunci Partisi. Setelah menerima entitas yang dimasukkan, Milvus menyimpannya ke dalam partisi yang berbeda berdasarkan nilai Kunci Partisi.
Partisi vs Kunci Partisi
Gambar berikut mengilustrasikan bagaimana Milvus memproses permintaan pencarian dalam koleksi dengan atau tanpa fitur Kunci Partisi diaktifkan.
Jika Kunci Partisi dinonaktifkan, Milvus akan mencari entitas yang paling mirip dengan vektor kueri di dalam koleksi. Anda dapat mempersempit cakupan pencarian jika Anda tahu partisi mana yang berisi hasil yang paling relevan.
Jika Kunci Partisi diaktifkan, Milvus menentukan cakupan pencarian berdasarkan nilai Kunci Partisi yang ditentukan dalam filter pencarian dan hanya memindai entitas di dalam partisi yang cocok.
Dengan atau Tanpa Kunci Partisi
Menggunakan Kunci Partisi
Untuk menggunakan Kunci Partisi, Anda perlu
Mengatur Kunci Partisi.
Mengatur jumlah partisi yang akan dibuat (Opsional), dan
Buat kondisi pemfilteran berdasarkan Kunci Partisi.
Mengatur Kunci Partisi
Untuk menetapkan bidang skalar sebagai Kunci Partisi, Anda perlu menyetel atribut is_partition_key
ke true
saat Anda menambahkan bidang skalar.
from pymilvus import (
MilvusClient, DataType
)
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
schema = client.create_schema()
# Add the partition key
schema.add_field(
field_name="my_varchar",
datatype=DataType.VARCHAR,
max_length=512,
# highlight-next-line
is_partition_key=True,
)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.common.DataType;
import io.milvus.v2.service.collection.request.AddFieldReq;
import io.milvus.v2.service.collection.request.CreateCollectionReq;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("http://localhost:19530")
.token("root:Milvus")
.build());
// Create schema
CreateCollectionReq.CollectionSchema schema = client.createSchema();
// Add the partition key
schema.addField(AddFieldReq.builder()
.fieldName("my_varchar")
.dataType(DataType.VarChar)
.maxLength(512)
// highlight-next-line
.isPartitionKey(true)
.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_varchar",
data_type: DataType.VarChar,
max_length: 512,
// highlight-next-line
is_partition_key: true
}
]
export schema='{
"autoId": true,
"enabledDynamicField": false,
"fields": [
{
"fieldName": "my_id",
"dataType": "Int64",
"isPrimary": true
},
{
"fieldName": "my_vector",
"dataType": "FloatVector",
"elementTypeParams": {
"dim": "5"
}
},
{
"fieldName": "my_varchar",
"dataType": "VarChar",
"isPartitionKey": true,
"elementTypeParams": {
"max_length": 512
}
}
]
}'
Mengatur Nomor Partisi
Ketika Anda menetapkan sebuah bidang skalar dalam koleksi sebagai Kunci Partisi, Milvus secara otomatis membuat 16 partisi dalam koleksi tersebut. Setelah menerima sebuah entitas, Milvus memilih partisi berdasarkan nilai Partition Key dari entitas tersebut dan menyimpan entitas di dalam partisi tersebut, yang mengakibatkan beberapa atau semua partisi menyimpan entitas dengan nilai Partition Key yang berbeda.
Anda juga dapat menentukan jumlah partisi yang akan dibuat bersama dengan koleksi. Ini hanya berlaku jika Anda memiliki bidang skalar yang ditetapkan sebagai Kunci Partisi.
client.create_collection(
collection_name="my_collection",
schema=schema,
# highlight-next-line
num_partitions=1024
)
import io.milvus.v2.service.collection.request.CreateCollectionReq;
CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()
.collectionName("my_collection")
.collectionSchema(schema)
.numPartitions(1024)
.build();
client.createCollection(createCollectionReq);
await client.create_collection({
collection_name: "my_collection",
schema: schema,
num_partitions: 1024
})
export params='{
"partitionsNum": 1024
}'
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\": \"myCollection\",
\"schema\": $schema,
\"params\": $params
}"
Membuat Kondisi Pemfilteran
Ketika melakukan pencarian ANN dalam koleksi dengan fitur Partition Key diaktifkan, Anda perlu menyertakan ekspresi pemfilteran yang melibatkan Partition Key dalam permintaan pencarian. Dalam ekspresi pemfilteran, Anda dapat membatasi nilai Kunci Partisi dalam rentang tertentu sehingga Milvus membatasi cakupan pencarian dalam partisi yang sesuai.
Ketika berurusan dengan operasi penghapusan, disarankan untuk menyertakan ekspresi penyaringan yang menentukan kunci partisi tunggal untuk mencapai penghapusan yang lebih efisien. Pendekatan ini membatasi operasi penghapusan pada partisi tertentu, mengurangi amplifikasi penulisan selama pemadatan dan menghemat sumber daya untuk pemadatan dan pengindeksan.
Contoh berikut ini mendemonstrasikan pemfilteran berbasis Kunci Partisi berdasarkan nilai Kunci Partisi tertentu dan sekumpulan nilai Kunci Partisi.
# Filter based on a single partition key value, or
filter='partition_key == "x" && <other conditions>'
# Filter based on multiple partition key values
filter='partition_key in ["x", "y", "z"] && <other conditions>'
// Filter based on a single partition key value, or
String filter = "partition_key == 'x' && <other conditions>";
// Filter based on multiple partition key values
String filter = "partition_key in ['x', 'y', 'z'] && <other conditions>";
// Filter based on a single partition key value, or
const filter = 'partition_key == "x" && <other conditions>'
// Filter based on multiple partition key values
const filter = 'partition_key in ["x", "y", "z"] && <other conditions>'
# Filter based on a single partition key value, or
export filter='partition_key == "x" && <other conditions>'
# Filter based on multiple partition key values
export filter='partition_key in ["x", "y", "z"] && <other conditions>'
Anda harus mengganti partition_key
dengan nama bidang yang ditetapkan sebagai kunci partisi.
Gunakan Isolasi Kunci Partisi
Dalam skenario multi-tenancy, Anda dapat menetapkan bidang skalar yang terkait dengan identitas penyewa sebagai kunci partisi dan membuat filter berdasarkan nilai tertentu dalam bidang skalar ini. Untuk lebih meningkatkan kinerja pencarian dalam skenario serupa, Milvus memperkenalkan fitur Isolasi Kunci Partisi.
Isolasi Kunci Partisi
Seperti yang ditunjukkan pada gambar di atas, Milvus mengelompokkan entitas berdasarkan nilai Kunci Partisi dan membuat indeks terpisah untuk masing-masing kelompok ini. Setelah menerima permintaan pencarian, Milvus menempatkan indeks berdasarkan nilai Kunci Partisi yang ditentukan dalam kondisi penyaringan dan membatasi cakupan pencarian dalam entitas yang termasuk dalam indeks, sehingga menghindari pemindaian entitas yang tidak relevan selama pencarian dan meningkatkan kinerja pencarian secara signifikan. Setelah Anda mengaktifkan Isolasi Kunci Partisi, Anda hanya dapat menyertakan nilai tertentu dalam filter berbasis kunci partisi sehingga Milvus dapat membatasi cakupan pencarian dalam entitas yang termasuk dalam indeks yang cocok.
Saat ini, fitur Isolasi Kunci Partisi hanya berlaku untuk pencarian dengan jenis indeks yang diatur ke HNSW.
Mengaktifkan Isolasi Kunci Partisi
Contoh kode berikut ini menunjukkan cara mengaktifkan Isolasi Kunci Partisi.
client.create_collection(
collection_name="my_collection",
schema=schema,
# highlight-next-line
properties={"partitionkey.isolation": True}
)
import io.milvus.v2.service.collection.request.CreateCollectionReq;
Map<String, String> properties = new HashMap<>();
properties.put("partitionkey.isolation", "true");
CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()
.collectionName("my_collection")
.collectionSchema(schema)
.numPartitions(1024)
.properties(properties)
.build();
client.createCollection(createCollectionReq);
res = await client.alterCollection({
collection_name: "my_collection",
properties: {
"partitionkey.isolation": true
}
})
export params='{
"partitionKeyIsolation": 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\": \"myCollection\",
\"schema\": $schema,
\"params\": $params
}"
Setelah Anda mengaktifkan Isolasi Kunci Partisi, Anda masih dapat mengatur Kunci Partisi dan jumlah partisi seperti yang dijelaskan dalam Mengatur Nomor Partisi. Perhatikan bahwa filter berbasis Kunci-Partisi harus menyertakan hanya nilai Kunci Partisi tertentu.