استخدام مفتاح التقسيم
مفتاح التقسيم هو حل لتحسين البحث استناداً إلى الأقسام. من خلال تعيين حقل قياسي محدد كمفتاح التقسيم وتحديد شروط التصفية بناءً على مفتاح التقسيم أثناء البحث، يمكن تضييق نطاق البحث إلى عدة أقسام، وبالتالي تحسين كفاءة البحث. ستقدم هذه المقالة كيفية استخدام مفتاح التقسيم والاعتبارات ذات الصلة.
نظرة عامة
في Milvus، يمكنك استخدام الأقسام لتنفيذ فصل البيانات وتحسين أداء البحث من خلال تقييد نطاق البحث إلى أقسام محددة. إذا اخترت إدارة الأقسام يدويًا، يمكنك إنشاء 1024 قسمًا كحد أقصى في مجموعة ما، وإدراج كيانات في هذه الأقسام استنادًا إلى قاعدة محددة بحيث يمكنك تضييق نطاق البحث عن طريق تقييد عمليات البحث ضمن عدد محدد من الأقسام.
يقدم لك Milvus مفتاح التقسيم لتتمكن من إعادة استخدام الأقسام في فصل البيانات للتغلب على الحد الأقصى لعدد الأقسام التي يمكنك إنشاؤها في مجموعة. عند إنشاء مجموعة، يمكنك استخدام حقل قياسي كمفتاح التقسيم. بمجرد أن تصبح المجموعة جاهزة، يقوم Milvus بإنشاء العدد المحدد من الأقسام داخل المجموعة مع كل قسم يتوافق مع نطاق من القيم الموجودة في مفتاح التقسيم. عند استلام الكيانات المدرجة، يقوم Milvus بتخزينها في أقسام مختلفة بناءً على قيم مفتاح التقسيم الخاصة بها.
التقسيم مقابل مفتاح القسم
يوضح الشكل التالي كيفية معالجة Milvus لطلبات البحث في مجموعة مع تمكين ميزة مفتاح التقسيم أو بدونها.
في حالة تعطيل مفتاح التقسيم، يبحث Milvus عن الكيانات الأكثر تشابهًا مع متجه الاستعلام داخل المجموعة. يمكنك تضييق نطاق البحث إذا كنت تعرف أي قسم يحتوي على أكثر النتائج ذات الصلة.
إذا تم تمكين مفتاح التقسيم، يحدد Milvus نطاق البحث استناداً إلى قيمة مفتاح التقسيم المحددة في عامل تصفية البحث ويقوم بمسح الكيانات الموجودة داخل الأقسام التي تتطابق فقط.
باستخدام مفتاح التقسيم أو بدونه
استخدام مفتاح التقسيم
لاستخدام مفتاح التقسيم، تحتاج إلى
تعيين مفتاح التقسيم.
تعيين عدد الأقسام المراد إنشاؤها (اختياري)، و
إنشاء شرط تصفية استناداً إلى مفتاح التقسيم.
تعيين مفتاح التقسيم
لتعيين حقل قياسي كمفتاح التقسيم، تحتاج إلى تعيين السمة is_partition_key
الخاصة به إلى true
عند إضافة الحقل القياسي.
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
}
}
]
}'
تعيين أرقام التقسيم
عندما تقوم بتعيين حقل قياسي في مجموعة كمفتاح التقسيم، يقوم Milvus تلقائيًا بإنشاء 16 قسمًا في المجموعة. عند استلام أحد الكيانات، يختار Milvus قسمًا بناءً على قيمة مفتاح التقسيم لهذا الكيان ويخزن الكيان في القسم، مما يؤدي إلى احتواء بعض أو كل الأقسام على كيانات بقيم مفاتيح أقسام مختلفة.
يمكنك أيضًا تحديد عدد الأقسام المراد إنشاؤها مع المجموعة. لا يكون هذا صالحًا إلا إذا كان لديك حقل قياسي معيّن كمفتاح التقسيم.
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
}"
إنشاء شرط التصفية
عند إجراء عمليات بحث ANN في مجموعة مع تمكين ميزة مفتاح التقسيم، تحتاج إلى تضمين تعبير تصفية يتضمن مفتاح التقسيم في طلب البحث. في تعبير التصفية، يمكنك في تعبير التصفية تقييد قيمة مفتاح التقسيم ضمن نطاق محدد بحيث يقيد Milvus نطاق البحث ضمن الأقسام المقابلة.
عند التعامل مع عمليات الحذف، من المستحسن تضمين تعبير تصفية يحدد مفتاح قسم واحد لتحقيق حذف أكثر كفاءة. يحد هذا النهج عملية الحذف من عملية الحذف إلى قسم معين، مما يقلل من تضخيم الكتابة أثناء الضغط ويحافظ على الموارد اللازمة للضغط والفهرسة.
توضّح الأمثلة التالية التصفية المستندة إلى مفتاح التقسيم استنادًا إلى قيمة مفتاح قسم محدد ومجموعة من قيم مفاتيح التقسيم.
# 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>'
عليك أن تستبدل partition_key
باسم الحقل الذي تم تعيينه كمفتاح التقسيم.
استخدام عزل مفتاح التقسيم
في سيناريو الإيجارات المتعددة، يمكنك تعيين الحقل القياسي المتعلق بهويات المستأجرين كمفتاح التقسيم وإنشاء عامل تصفية يستند إلى قيمة محددة في هذا الحقل القياسي. لتحسين أداء البحث بشكل أكبر في سيناريوهات مماثلة، يقدم Milvus ميزة عزل مفتاح التقسيم.
عزل مفتاح التقسيم
كما هو موضح في الشكل أعلاه، يقوم Milvus بتجميع الكيانات بناءً على قيمة مفتاح التقسيم وإنشاء فهرس منفصل لكل مجموعة من هذه المجموعات. عند تلقي طلب بحث، يقوم ملفوس بتحديد موقع الفهرس استناداً إلى قيمة مفتاح التقسيم المحددة في شرط التصفية ويقيد نطاق البحث ضمن الكيانات المضمنة في الفهرس، وبالتالي تجنب مسح الكيانات غير ذات الصلة أثناء البحث وتحسين أداء البحث بشكل كبير. بمجرد تمكين عزل مفتاح التقسيم، يمكنك تضمين قيمة محددة فقط في عامل التصفية المستند إلى مفتاح التقسيم بحيث يمكن لـ Milvus تقييد نطاق البحث ضمن الكيانات المضمنة في الفهرس التي تتطابق.
في الوقت الحالي، تنطبق ميزة عزل مفتاح التقسيم فقط على عمليات البحث مع تعيين نوع الفهرس إلى HNSW.
تمكين عزل مفتاح التقسيم
توضح الأمثلة البرمجية التالية كيفية تمكين عزل مفتاح التقسيم.
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
}"
بمجرد تمكين عزل مفتاح القسم، لا يزال بإمكانك تعيين مفتاح القسم وعدد الأقسام كما هو موضح في تعيين أرقام الأقسام. لاحظ أن عامل التصفية المستند إلى مفتاح التقسيم يجب أن يتضمن قيمة مفتاح قسم محدد فقط.