تجاوزت تطبيقات البحث الحديثة مجرد مطابقة الكلمات المفتاحية. يتوقع المستخدمون اليوم تجربة سلسة تفهم النية الدلالية وتحترم المصطلحات المحددة وتراعي الموقع الجغرافي. على سبيل المثال، قد يبحث مستخدم عن "أفضل مطاعم نباتية بالقرب مني"، حيث يشير "بالقرب مني" إلى الموقع الجغرافي، و"نباتي" هو قيد على الكلمات المفتاحية، بينما تشير "أفضل" إلى ترتيب دلالي بناءً على المراجعات أو تضمينات الصور.
تواجه العديد من البنى التقليدية صعوبة في التعامل مع هذه الأنواع الثلاثة المختلفة من البيانات في نفس الوقت دون تنسيق معقد لخدمات الميكرو. يعالج Vespa، محرك البحث والتقديم مفتوح المصدر، هذا التحدي بشكل أصلي. من خلال اعتبار المتجهات والنص والمواضع مواطنين من الدرجة الأولى، يتيح Vespa للمطورين دمج هذه الإشارات في استعلام واحد عالي الأداء.
لماذا يهم البحث متعدد الوسائط
لم يعد البحث الهجين مجرد شيء جديد؛ بل أصبح متطلبًا. غالبًا ما تفتقر عمليات البحث النقية بالمتجهات إلى الدقة اللازمة للأسماء التجارية الدقيقة أو الأكواد التقنية. تفشل عمليات البحث النقية بالكلمات المفتاحية في التقاط الدقة الدلالية لاستعلامات اللغة الطبيعية. إضافة قيود الموقع الجغرافي تخلق طبقة أخرى من التعقيد، حيث يتم تخزين بيانات الموقع غالبًا بشكل منفصل عن المحتوى.
تزيل بنية Vespa هذه العزلات. فهي تفهرس جميع أنواع البيانات في مخطط موحّد، مما يسمح لملف الترتيب بوزن هذه الإشارات ودمجها باستخدام دوال ترتيب مخصصة. وهذا يؤدي إلى زمن استجابة أقل وارتباط أعلى مقارنة بتكامل محركات البحث المتعددة.
تعريف المخطط: هيكلة البيانات متعددة الوسائط
لتفعيل البحث متعدد الوسائط، يجب أن يعرّف مخططك أنواع الحقول المناسبة. يدعم Vespa string للنص، وgeopoint للموقع، وtensor لتضمينات المتجهات.
schema products {
document store {
field name type string {
index
}
field location type geopoint {
index
}
field embedding type tensor<float>[128] {
index
}
field category type string {
index
}
}
}
لاحظ أن حقل tensor يتطلب فهرسًا ليكون قابلاً للبحث عبر التشابه المتجهي، بينما يتطلب geopoint فهرسًا للاستعلامات المكانية.
صياغة الاستعلام متعدد الوسائط
تتمثل قوة Vespa في قدرتها على تنفيذ استعلام واحد يستهدف أنواع بيانات متعددة. يمكنك استخدام عبارة select للتصفية حسب الموقع، والتصفية حسب الكلمات المفتاحية، وإجراء بحث أقرب جارٍ متجهي في نفس الوقت.
فكّر في استعلام عن "فنادق فاخرة في باريس بتصميم حديث". قد تهيكل استعلامك على النحو التالي:
GET /search/?query=(
userQuery:(luxury hotel) OR
embedding:nearestNeighbor(embedding, [0.1, 0.2, ...])
) AND location:geoCircle(48.8566, 2.3522, 5km)
&ranking=queryName
في هذا المثال:
- مطابقة الكلمات المفتاحية: يضمن
userQuery:(luxury hotel)مطابقة النص التقليدية. - مطابقة المتجهات: يجد
nearestNeighborمستندات متشابهة دلالياً بناءً على متجه الاستعلام المضمّن. - فلتر الموقع الجغرافي: يقيّد
geoCircleالنتائج بما لا يتجاوز 5 كم من إحداثيات باريس.
استراتيجيات الترتيب للدمج
إن استرجاع النتائج من جميع المصادر الثلاثة ليس كافياً؛ يجب عليك ترتيبها بشكل متماسك. يتيح لك ملف الترتيب (Rank Profile) في Vespa تعريف معادلات مخصصة تمزج الدرجات من حقول مختلفة.
rank-profile MultiModalRank {
inputs {
input<float> vectorWeight: 0.5
input<float> keywordWeight: 0.3
input<float> locationWeight: 0.2
}
first-phase {
function<float> vector_score() {
expression: closestMatchDistance(embedding)
}
function<float> keyword_score() {
expression: bm25(name)
}
function<float> location_score() {
expression: 1.0 - geoDistance(location) / 10000.0
}
expression: vectorWeight * vector_score() +
keywordWeight * keyword_score() +
locationWeight * location_score()
}
}
توزن هذه المعادلة كل مكون ديناميكياً. يمكن للمطورين ضبط هذه الأوزان بناءً على اختبارات A/B لتحسينها لتناسب حالتهم الاستخدامية المحددة، سواء كانوا يعطون الأولوية للارتباط الدلالي أو القرب الجغرافي.
الخاتمة
يوفر Vespa حلاً متينًا وقابلاً للتوسع للبحث متعدد الوسائط، مما يلغي تعقيد تكامل قواعد بيانات المتجهات والنص والموقع الجغرافي المنفصلة. من خلال الاستفادة من فهرسته الموحّد ومحرك الترتيب المرن، يمكن للمطورين بناء تجارب بحث ذات صلة عالية وواعية بالسياق بزمن استجابة منخفض. ومع تنوع البيانات بشكل متزايد، يصبح القدرة على دمج هذه الوسائط في استعلام واحد ميزة تنافسية حاسمة.