استخدام البحث النصي

استخدِم ميزات البحث النصي في Cloud Firestore للبحث عن سلاسل معيّنة ضمن مجموعة.

قبل البدء

قبل البدء في استخدام عمليات البحث النصية، اتّبِع الخطوات التالية:

  1. تأكَّد من إمكانية الوصول إلى قاعدة بيانات حالية متوافقة مع عمليات MongoDB، أو أنشئ قاعدة بيانات واتّصِل بها.

  2. تأكَّد من توفّر فهرس نصي، أو أنشئ فهرسًا نصيًا.

تستخدم عمليات البحث النصية عامل التشغيل $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.