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

يمكنك استخدام ميزات البحث عن نص في 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، قد تستخدم العناصر غير المتصلة بالبحث فهارس مرتبة حالية لتحسين البحث. إذا لم تتم فهرسة العناصر غير المتصلة الأخرى، يعتمد البحث على فحص المجموعة.
  • لا يمكن استخدام $text مع التلميحات.
  • لا يمكن لطلبات البحث التي تتضمّن بحثًا عن نص أن يتم فرزها حسب $natural.