استخدِم ميزات البحث النصي في Cloud Firestore للبحث عن سلاسل معيّنة ضمن مجموعة.
قبل البدء
قبل البدء في استخدام عمليات البحث النصية، اتّبِع الخطوات التالية:
تأكَّد من إمكانية الوصول إلى قاعدة بيانات حالية متوافقة مع عمليات MongoDB، أو أنشئ قاعدة بيانات واتّصِل بها.
تأكَّد من توفّر فهرس نصي، أو أنشئ فهرسًا نصيًا.
إجراء بحث نصي
تستخدم عمليات البحث النصية عامل التشغيل $text داخل فلتر.
حدِّد السلسلة المطلوب البحث عنها في الوسيطة $search.
إجراء بحث نصي عام
نفِّذ الأمر التالي لإجراء بحث عام عن نص:
# Find search
db.cities.find({ $text: { $search: "french bread" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "french bread" } } }
]);
إذا كان الفهرس مقسَّمًا، يمكنك الفلترة استنادًا إلى القسم من خلال تضمين القسم في فلتر المساواة "و" ضمن عملية البحث.
على سبيل المثال، إذا كان لديك قسم city، يمكنك فلترة عملية البحث النصي على النحو التالي:
db.myCollection.find( { $and: [
{ $text: { $search: "french bread" } },
{ "city": "Paris" }
] } )
يمكنك أيضًا فلترة عملية تجميع استنادًا إلى عملية تقسيم. على سبيل المثال:
db.myCollection.aggregate([
{ $match: { $text: { $search: "french bread" } } },
{ "city": "Paris" }
] );
يجب أن تكون قيمة القسم سلسلة. يجب ربط فلتر التقسيم بعملية البحث النصي باستخدام "و".
ضبط لغة البحث النصي
يمكنك ضبط لغة البحث النصي باستخدام الوسيطة $language. على سبيل المثال:
db.cities.find({ $text: { $search: "french bread", $language: "en"} })
في حال عدم ضبط لغة، سيتم استخدام لغة فهرس النص في البحث.
البحث عن عبارة مطابقة تمامًا
للبحث عن عبارة مطابقة تمامًا، اضبط العبارة كسلسلة من الكلمات محاطة بعلامات اقتباس مزدوجة. على سبيل المثال:
# Find search
db.cities.find({ $text: { $search: "\"best french bread\"" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "\"best french bread\"" } } },
]);
البحث عن مجموعة عبارات
لجعل البحث النصي أكثر دقة، حدِّد سلسلة من العبارات. على سبيل المثال، يعرض البحث التالي المستندات التي تتطابق مع المجموعة best AND french AND ("bread" OR "is"):
# Find search
db.cities.find({ $text: { $search: "\"best\" \"french\" bread is" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "\"best\" \"french\" bread is" } } },
]);
استبعاد عبارة
لاستبعاد عبارة من البحث النصي، أضِف واصلة (-) قبل العبارة:
# Find search
db.cities.find({ $text: { $search: "best bread -french"} })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "best bread -french" } } },
]);
احتساب نتيجة مدى الصلة بموضوع البحث
استخدِم التعبير {$meta: "textScore"} لاحتساب نتيجة الملاءمة للمستندات المطابقة لعملية البحث النصي. لترتيب النتائج تنازليًا حسب درجة المطابقة، استخدِم $meta في عبارة ترتيب. يُرجى الاطّلاع على الأمثلة التالية، حيث SCORE_FIELD هو اسم الحقل المستخدَم لتخزين قيمة النتيجة:
# Find search
db.cities
.find({ $text: { $search: "best french bread" } })
.sort({ SCORE_FIELD: { $meta: "textScore" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "best french bread" } } },
{ $sort: { "SCORE_FIELD": { $meta: "textScore"} } },
]);
يمكنك أيضًا استخدام نتيجة النص في عبارات العرض. على سبيل المثال:
# Find search
db.cities
.find({ $text: { $search: "best french bread" } })
.project({ score: { $meta: "textScore" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "best french bread" } } },
{ $project: { "scoreField": { $meta: "textScore"} } },
]);
توسيع نطاق البحث
لتعزيز صلة نتائج البحث النصي بالموضوع، يضيف عامل التشغيل $text إلى سلسلة البحث وفقًا للغة المحدّدة، وذلك لتضمين نتائج مطابقة للمرادفات التي تراعي السياق، والأشكال المشتقة، والعبارات التي تم تصحيح أخطائها الإملائية، والأشكال المختلفة للعلامات التشكيلية، وغير ذلك.
القيود
- لا يمكن استخدام العاملَين
$nearو$textفي عملية البحث النصي نفسها. - يُسمح باستخدام عامل تشغيل
$textواحد فقط لكل عملية بحثfindأوaggregation. - في عمليات التجميع، يجب أن تكون المرحلة
$matchالتي تتضمّن$textهي المرحلة الأولى في مسار العرض. - يمكن دمج
$textداخل$andو$orفقط. - إذا كان
$textداخل$or، يمكن أن تستخدم العناصر المنفصلة غير التابعة لـ "بحث Google" فهارس مرتبة حالية لتحسين البحث. إذا لم تتم فهرسة العناصر الأخرى غير المتصلة، سيعتمد البحث على فحص المجموعة. - لا يمكن استخدام
$textمع التلميحات. - لا يمكن ترتيب طلبات البحث التي تتضمّن البحث النصي حسب
$natural.