شرح المخطط
يحدد المخطط بنية بيانات المجموعة. قبل إنشاء المجموعة، يتعين عليك وضع تصميم لمخططها. تساعدك هذه الصفحة على فهم مخطط المجموعة وتصميم مخطط نموذجي بنفسك.
نظرة عامة
في Milvus، يقوم مخطط المجموعة بتجميع جدول في قاعدة بيانات علائقية، والذي يحدد كيفية تنظيم Milvus للبيانات في المجموعة.
يعد المخطط المصمم جيدًا أمرًا ضروريًا لأنه يلخص نموذج البيانات ويحدد ما إذا كان بإمكانك تحقيق الأهداف التجارية من خلال البحث. علاوة على ذلك، نظرًا لأن كل صف من البيانات التي يتم إدراجها في المجموعة يجب أن يتبع المخطط، فإنه يساعد في الحفاظ على اتساق البيانات وجودتها على المدى الطويل. من الناحية الفنية، يؤدي المخطط المحدد جيدًا إلى تخزين بيانات الأعمدة بشكل منظم وبنية فهرس أكثر نظافة، مما يعزز أداء البحث.
يحتوي مخطط المجموعة على مفتاح أساسي، وحقل متجه واحد على الأقل، والعديد من الحقول القياسية. يوضح الرسم البياني التالي كيفية ربط مقال بقائمة حقول المخطط.
تشريح تصميم المخطط
يتضمن تصميم نموذج البيانات لنظام البحث تحليل احتياجات العمل وتجريد المعلومات إلى نموذج بيانات معبر عنه بمخطط. على سبيل المثال، يجب «فهرسة» البحث عن جزء من النص عن طريق تحويل السلسلة النصية إلى متجه من خلال «التضمين» وتمكين البحث المتجهي. بالإضافة إلى هذا المطلب الأساسي، قد يكون من الضروري تخزين خصائص أخرى مثل الطابع الزمني للنشر والمؤلف. تسمح هذه البيانات الوصفية بتحسين عمليات البحث الدلالي من خلال التصفية، بحيث يتم عرض النصوص المنشورة بعد تاريخ محدد أو التي كتبها مؤلف معين فقط. يمكنك أيضًا استرداد هذه القيم القياسية مع النص الرئيسي لعرض نتيجة البحث في التطبيق. يجب تعيين معرّف فريد لكل منها لتنظيم هذه المقاطع النصية، ويُعبَّر عنه كعدد صحيح أو سلسلة نصية. هذه العناصر أساسية لتحقيق منطق بحث متطور.
راجع «تطبيق عملي لتصميم المخطط » لمعرفة كيفية إنشاء مخطط جيد التصميم.
إنشاء مخطط
يوضح مقتطف الشفرة التالي كيفية إنشاء مخطط.
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": []
}'
إضافة الحقل الأساسي
يُعرّف الحقل الأساسي في المجموعة الكيان بشكل فريد. ولا يقبل سوى قيم Int64 أو VARCHAR. توضح مقتطفات الكود التالية كيفية إضافة الحقل الأساسي.
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
]
}'
عند إضافة حقل، يمكنك تحديد الحقل صراحةً كحقل أساسي عن طريق تعيين خاصية is_primary الخاصة به إلى True. يقبل الحقل الأساسي قيم Int64 بشكل افتراضي. في هذه الحالة، يجب أن تكون قيمة الحقل الأساسي أعدادًا صحيحة مشابهة لـ 12345. إذا اخترت استخدام قيم VARCHAR في الحقل الأساسي، فيجب أن تكون القيمة سلاسل مشابهة لـ my_entity_1234.
يمكنك أيضًا تعيين خصائص autoId إلى True لجعل Milvus يقوم تلقائيًا بتخصيص قيم الحقول الأساسية عند إدراج البيانات.
يُنصح بالاعتماد على autoId في جميع الحالات ما لم يكن تعيين المفاتيح الأساسية يدويًا مفيدًا.
للحصول على التفاصيل، راجع الحقل الأساسي وAutoId.
إضافة حقول متجهة
تقبل الحقول المتجهة مختلف أنواع التضمينات المتجهة المتفرقة والكثيفة. في Milvus، يمكنك إضافة أربعة حقول متجهة إلى مجموعة. توضح مقتطفات الكود التالية كيفية إضافة حقل متجه.
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
]
}"
تشير المعلمة dim في مقتطفات الكود أعلاه إلى أبعاد التضمينات المتجهة التي سيتم الاحتفاظ بها في الحقل المتجه. تشير القيمة FLOAT_VECTOR إلى أن الحقل المتجه يحتوي على قائمة من الأرقام العائمة ذات 32 بت، والتي تُستخدم عادةً لتمثيل المضاد اللوغاريتمي. بالإضافة إلى ذلك، يدعم Milvus أيضًا أنواع التضمينات المتجهة التالية:
FLOAT16_VECTORيحتوي حقل المتجهات من هذا النوع على قائمة من الأرقام العائمة ذات الدقة النصفية ذات 16 بت، وعادةً ما ينطبق على سيناريوهات التعلم العميق أو الحوسبة القائمة على وحدة معالجة الرسومات (GPU) التي تكون مقيدة بالذاكرة أو عرض النطاق الترددي.
BFLOAT16_VECTORيحتوي الحقل المتجه من هذا النوع على قائمة من الأرقام العائمة ذات 16 بت التي تتميز بدقة مخفضة ولكن بنفس نطاق الأس مثل Float32. ويُستخدم هذا النوع من البيانات بشكل شائع في سيناريوهات التعلم العميق، حيث يقلل من استخدام الذاكرة دون التأثير بشكل كبير على الدقة.
INT8_VECTORيخزن حقل المتجهات من هذا النوع متجهات مكونة من أعداد صحيحة موقعة ذات 8 بت (int8)، حيث يتراوح كل مكون بين –128 و127. وهو مصمم خصيصًا لبنى التعلم العميق المُكمَّنة — مثل ResNet و EfficientNet — حيث يقلل بشكل كبير من حجم النموذج ويعزز سرعة الاستدلال، كل ذلك مع تكبد فقدان ضئيل للغاية في الدقة. ملاحظة: يُدعم هذا النوع من المتجهات فقط لمؤشرات HNSW.
BINARY_VECTORيحتوي حقل المتجهات من هذا النوع على قائمة من الأصفار والآحاد. وهي تعمل كميزات مدمجة لتمثيل البيانات في سيناريوهات معالجة الصور واسترجاع المعلومات.
SPARSE_FLOAT_VECTORيحتوي الحقل المتجه من هذا النوع على قائمة من الأرقام غير الصفرية وأرقام تسلسلها لتمثيل تضمينات المتجهات المتفرقة.
إضافة الحقول القياسية
في الحالات الشائعة، يمكنك استخدام الحقول القياسية لتخزين البيانات الوصفية لتضمينات المتجهات المخزنة في Milvus، وإجراء عمليات بحث باستخدام الشبكات العصبية الاصطناعية (ANN) مع تصفية البيانات الوصفية لتحسين دقة نتائج البحث. يدعم Milvus أنواعًا متعددة من الحقول القياسية، بما في ذلك VARCHAR وBoolean وInt وFloat وDouble.
إضافة حقول VARCHAR
في Milvus، يمكنك استخدام حقول VARCHAR لتخزين السلاسل النصية. لمزيد من المعلومات حول حقل VARCHAR ، راجع حقل 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
]
}"
إضافة حقول الأرقام
أنواع الأرقام التي يدعمها Milvus هي Int8 و Int16 و Int32 و Int64 و Float و Double. لمزيد من المعلومات حول الحقول الرقمية، راجع حقل الأرقام.
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
]
}"
إضافة الحقول المنطقية
يدعم Milvus الحقول المنطقية. توضح مقتطفات الكود التالية كيفية إضافة حقل منطقي.
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
]
}"
إضافة الحقول المركبة
في Milvus، الحقل المركب هو حقل يمكن تقسيمه إلى حقول فرعية أصغر، مثل المفاتيح في حقل JSON أو الفهارس في حقل Array.
إضافة حقول JSON
عادةً ما يخزن حقل JSON بيانات JSON شبه منظمة. لمزيد من المعلومات حول حقول JSON، راجع حقل 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
]
}"
إضافة حقول المصفوفات
يخزن حقل المصفوفة قائمة بالعناصر. يجب أن تكون أنواع بيانات جميع العناصر في حقل المصفوفة متماثلة. لمزيد من المعلومات حول حقول المصفوفة، راجع «حقل المصفوفة».
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
]
}"