المؤشر
أحد الميزات الرئيسية لـ Qdrant هو الجمع الفعّال بين فهرس الناقل والفهرس التقليدي. يعد هذا أمرًا حاسمًا لأن وجود فقط فهرس الناقل لا يكفي لتمكين البحث الفعّال عن الناقل تحت ظروف الفرز. بشكل بسيط، يسرع فهرس الناقل البحث عن الناقل، في حين يسرع فهرس الحمولة الفرز.
يوجد الفهرس داخل الفقرة بشكل مستقل، ولكن معلمات الفهرس نفسه مُهيأة للمجموعة بأكملها.
ليست لدى جميع الفقرات فهارس تلقائيًا. يعتمد هذا على متطلبات إعدادات التحسين ويعتمد عادة على عدد النقاط المخزنة.
فهرس الحمولة
يتمثل فهرس الحمولة في Qdrant مشابهًا للفهرس في قاعدة بيانات المستندات التقليدية. يتم بناء هذا الفهرس للحقول والأنواع المحددة، ويُستخدم لاسترجاع النقاط بسرعة استنادًا إلى شروط الفلترة المقابلة.
كما يُستخدم لتقدير عدد الفرزات بدقة، مما يساعد مخطط الاستعلام في اختيار استراتيجيات البحث.
يتطلب إنشاء فهرس موارد حسابية إضافية وذاكرة إضافية، لذلك من الأمر بالغ الأهمية اختيار الحقول التي سيتم فهرسة نقاطها بعناية. لن يقوم Qdrant باختيار ذلك لك، بل يفوضه للمستخدم.
يمكن استخدام الطريقة التالية لتحديد حقل كمفهرس:
PUT /collections/{collection_name}/index
{
"field_name": "اسم الحقل الذي سيتم فهرسته",
"field_schema": "keyword"
}
أنواع الحقول المتاحة هي:
-
keyword
- لحمولة الكلمة الرئيسية، وتؤثر في شروط تطابق الفلتر. -
integer
- لحمولة العدد الصحيح، وتؤثر في شروط تطابق الفلتر والنطاق. -
float
- لحمولة العدد عشري، وتؤثر في شروط النطاق. -
bool
- لحمولة القيمة المنطقية، وتؤثر في شروط تطابق الفلتر (متاح ابتداءً من الإصدار 1.4.0). -
geo
- لحمولة الجغرافيا، وتؤثر في صناديق الحدود الجغرافية وشروط النطاق الجغرافي. -
text
- نوع فهرس خاص مناسب لحمولة الكلمة/السلسلة، ويؤثر في شروط بحث النص الكامل.
قد تستهلك فهارس الحمولة ذاكرة إضافية، لذا يُنصح بفهرسة الحقول المستخدمة في شروط الفلترة فقط. إذا كنت بحاجة إلى عملية فلترة استنادًا إلى العديد من الحقول، ولا تسمح القيود الذاكرية بفهرسة كل منها، فمن المستحسن اختيار الحقول التي تقيد نتائج البحث أكثر. بشكل عام، كلما كان لقيم الحمولة قيم فريدة أكثر، كان استخدام الفهرس أكثر فعالية.
فهرس النص الكامل
متاح ابتداءً من الإصدار 0.10.0
يدعم Qdrant البحث النصي الكامل لحمولات السلسلة. يتيح فهرس النص الكامل لك فلترة النقاط استنادًا إلى وجود كلمات أو عبارات في حقل الحمولة.
تكوين فهرس النص الكامل معقد إلى حد ما لأنه يمكنك تحديد معلمات الترميز. الترميز هو عملية تقسيم سلسلة إلى رموز، ثم فهرسة هذه الرموز في فهرس منقوض.
لإنشاء فهرس نص كامل، يمكنك استخدام الطريقة التالية:
PUT /collections/{collection_name}/index
{
"field_name": "اسم الحقل الذي سيتم فهرسته",
"field_schema": {
"type": "text",
"tokenizer": "كلمة",
"min_token_len": 2,
"max_token_len": 20,
"lowercase": true
}
}
وسائل الترميز المتاحة هي:
-
word
- يفصل السلسلة استنادًا إلى المسافات والترقيم والرموز الخاصة. -
whitespace
- يفصل السلسلة استنادًا إلى المسافات. -
prefix
- يفصل السلسلة استنادًا إلى المسافات والترقيم والرموز الخاصة، ثم ينشئ فهرسًا بادئًا لكل كلمة. على سبيل المثال، يُفهرس "hello" على أنه "h", "he", "hel", "hell", "hello". -
multilingual
- نوع خاص من أنواع الترميز استنادًا إلى مجموعة charabia. يتيح ترميز وتحويل الكلمات بلغات متعددة، بما في ذلك اللغات غير اللاتينية وفاصلات الفضاء غير المسافة. يُرجى الرجوع إلى توثيق charabia للحصول على قائمة كاملة باللغات المدعومة وخيارات التطبيع. في تكوين البنية الافتراضية، لا يتضمن qdrant دعمًا لجميع اللغات لأن ذلك سيزيد من حجم الملفات الثنائية. الصينية واليابانية والكورية غير مُمكّنة افتراضيًا، ولكن يمكن تمكينها من خلال بناء qdrant من الشفرة المصدرية باستخدام العلامات "--features multiling-chinese, multiling-japanese, multiling-korean".
يرجى الرجوع إلى أمثلة التطابق النصي الكامل لمثال على استخدام فهرس النص الكامل في الاستعلامات.
ترقيم الفيكتور
تعتمد ترقيم الفيكتور على هيكل بيانات يعتمد على الفيكتورات، ويتم بناؤه من خلال نماذج رياضية محددة. باستخدام ترقيم الفيكتور، يمكننا الاستعلام بشكل فعال عن فيكتورات متعددة مماثلة للفيكتور المستهدف.
حاليًا، يستخدم Qdrant فقط HNSW كترقيم الفيكتور.
HNSW (الرسم البياني للعالم الصغير التنقلي التسلسلي) هو خوارزمية فهرسة استنادية إلى الرسم البياني. وفقًا لقواعد معينة، يقوم ببناء هيكل تنقل متعدد الطبقات للرسم البياني. في هذا الهيكل، تكون الطبقات العليا أكثر انفصالًا، مع مسافات أكبر بين العقد. الطبقات السفلى أكثر اكتظاظًا، مع مسافات أصغر بين العقد. يبدأ البحث من الطبقة العلوية، حيث يتم العثور على أقرب عقد إلى الهدف في تلك الطبقة، ثم الانتقال إلى الطبقة التالية لبحث آخر. بعد عدة تكرارات، يمكنه الوصول بسرعة إلى الموضع المستهدف.
لتحسين الأداء، تقوم HNSW بتحديد الحد الأقصى لدرجة العقد على كل طبقة من الرسم البياني بـ m
. بالإضافة إلى ذلك، يمكنك تحديد نطاق البحث باستخدام ef_construct
(أثناء بناء الفهرس) أو ef
(أثناء البحث عن الهدف).
يمكن تكوين هذه المعلمات في ملف التكوين:
storage:
hnsw_index:
m: 16
ef_construct: 100
full_scan_threshold: 10000
أثناء عملية إنشاء المجموعة، يمكن تكوين المعلمة ef
وتكون مساوية لـ ef_construct
افتراضيًا.
تم اختيار HNSW لعدة أسباب. أولاً، HNSW متوافق تمامًا مع إمكانية Qdrant تعديل الفلاتر أثناء عملية البحث. ثانيًا، وفقًا لـ اختبارات المقارنة العامة، فإنها واحدة من أدق وأسرع الخوارزميات.
متوفرة من الإصدار v1.1.1
يمكن ضبط معلمات HNSW أيضًا للمجموعات والفيكتورات المسماة لتحسين أداء البحث من خلال ضبط hnsw_config
.
فهرس قابل للفرز
الفهارس الفرعية المستقلة وحتى فهارس الفيكتورات وحدها لا يمكن أن تواجه بشكل كامل استخدام الفلاتر في عمليات البحث.
في الحالات التي تكون فيها الفلاتر ضعيفة، يمكن استخدام فهرس HNSW مباشرة. في الحالات التي تكون فيها الفلاتر صارمة، يمكن استخدام فهرس الحمولة وإعادة تسجيله بالكامل. ومع ذلك، في الحالات المتوسطة، هذا النهج غير فعال.
من ناحية، لا يمكننا تحمل إجراء فحص كامل على الكثير من الفيكتورات. من ناحية أخرى، عند استخدام فلاتر صارمة للغاية، يبدأ الرسم البياني HNSW في التدهور.
تسمح الحواف الإضافية لك باستخدام فهرس HNSW بكفاءة للبحث عن فيكتورات مجاورة وتطبيق الفلاتر أثناء البحث في الرسم البياني.
يقلل هذا النهج من العبء الناتج عن فحوصات الشروط، حيث تحتاج إلى حساب الشروط فقط لجزء صغير من النقاط المشاركة في البحث.