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

استخدِم ميزات البحث النصي في 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" } } }
  ]);

إذا كان الفهرس مقسّمًا، يمكنك الفلترة استنادًا إلى القسم من خلال تضمين القسم في فلتر مساواة "and" ضمن عملية البحث. على سبيل المثال، إذا كان لديك قسم city، يمكنك فلترة البحث النصي على النحو التالي:

db.myCollection.find( { $and: [
  { $text: { $search: "french bread" } },
  { "city": "Paris" }
] } )

يمكنك أيضًا فلترة عملية تجميع استنادًا إلى قسم. على سبيل المثال:

db.myCollection.aggregate([
 { $match: { $text: { $search: "french bread" } } },
 { "city": "Paris" }
] );

يجب أن تكون قيمة القسم سلسلة. يجب ربط فلتر التقسيم بالبحث النصي باستخدام "and".

ضبط لغة البحث النصي

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