فهرس النص (Text Index)
قبل أي بحث نصي، لازم فهرس من نوع text على الحقول المطلوب البحث فيها:
db.articles.createIndex({ title: "text", body: "text" })
⚠️ كل مجموعة (collection) تقدر تملك فهرس نصي واحد فقط، حتى لو غطّى عدّة حقول.
البحث بـ $text
db.articles.find({ $text: { $search: "قواعد بيانات" } })
- البحث الافتراضي غير حسّاس لحالة الأحرف ولا للتشكيل.
- يبحث عن أي كلمة من الكلمات (OR ضمنيًّا)، لا الجملة كاملة.
بحث عن جملة محدّدة
ضع الجملة بين علامتَي اقتباس داخل $search للمطابقة الحرفية:
db.articles.find({ $text: { $search: "\"قواعد بيانات NoSQL\"" } })
استبعاد كلمة
ضع - قبل الكلمة المراد استبعادها:
db.articles.find({ $text: { $search: "mongodb -sql" } }) // mongodb بدون sql
الترتيب حسب الصلة (Relevance)
استخدم $meta لجلب درجة التطابق والترتيب حسبها:
db.articles.find(
{ $text: { $search: "قواعد بيانات" } },
{ score: { $meta: "textScore" } }
).sort({ score: { $meta: "textScore" } })
$text مقابل Atlas Search
$text (فهرس نصي عادي) | $search (Atlas Search) | |
|---|---|---|
| البيئة | يعمل محليًّا وعلى Atlas | يتطلّب Atlas |
| المحرّك | مدمج في MongoDB | Apache Lucene |
| الميزات | بحث بسيط، ترتيب بالصلة | تصحيح إملائي، autocomplete، مرادفات، تحليلات لغوية متقدّمة |
| عدد الفهارس | فهرس واحد لكل مجموعة | عدّة فهارس لكل مجموعة |
💡 MongoDB توصي رسميًّا بـ
$search(المشروح في درس Atlas) للتطبيقات الإنتاجية الجادّة —$textيبقى خيارًا سريعًا وكافيًا للمشاريع الصغيرة أو النشر الذاتي بلا Atlas.
🎯 التالي: النسخ المتماثلة والتوسّع الأفقي.