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

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

قبل البدء

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

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

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

أذونات "إدارة الهوية وإمكانية الوصول"

لإنشاء فهرس في Cloud Firestore، تأكَّد من أنّك حصلت على أي من الأدوار التالية:

  • roles/datastore.owner
  • roles/datastore.indexAdmin
  • roles/editor
  • roles/owner

لمنح دور، يُرجى الاطّلاع على منح دور واحد. لمزيد من المعلومات عن أدوار Cloud Firestore والأذونات المرتبطة بها، يُرجى الاطّلاع على الأدوار المُحدَّدة مسبقًا.

إذا كنت قد حدّدت أدوارًا مخصّصة، عليك منح جميع الأذونات التالية لإنشاء الفهارس:

  • datastore.indexes.create
  • datastore.indexes.delete
  • datastore.indexes.get
  • datastore.indexes.list
  • datastore.indexes.update

تنفيذ طلب بحث نصي

تستخدِم طلبات البحث النصية عامل التشغيل $text داخل فلتر. حدِّد السلسلة المطلوب البحث عنها في الوسيطة $search.

تنفيذ طلب بحث عام باستخدام النص

نفِّذ الاستعلام التالي لإجراء استعلام عام:

  # Find query
  db.cities.find({ $text: { $search: "french bread" } })

  # Aggregation query
  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 query
  db.cities.find({ $text: { $search: "\"best french bread\"" } })

  # Aggregation query
  db.cities.aggregate([
    { $match: { $text: { $search: "\"best french bread\"" } } },
  ]);

طلب بحث عن تركيبة عبارات

لجعل طلب البحث أكثر دقةً، حدِّد سلسلة من العبارات. على سبيل المثال، يعرض طلب البحث التالي المستندات التي تتطابق مع المجموعة best AND french AND ("bread" OR "is"):

  # Find query
  db.cities.find({ $text: { $search: "\"best\" \"french\" bread is" } })

  # Aggregation query
  db.cities.aggregate([
    { $match: { $text: { $search: "\"best\" \"french\" bread is" } } },
  ]);

استبعاد عبارة

لاستبعاد عبارة من طلب بحث، أضِف واصلة (-) قبل العبارة:

  # Find query
  db.cities.find({ $text: { $search: "best bread -french"} })

  # Aggregation query
  db.cities.aggregate([
    { $match: { $text: { $search: "best bread -french" } } },
  ]);

احتساب نتيجة الصلة بموضوع البحث

استخدِم تعبير {$meta: "textScore"} لحساب نتيجة الصلة للمستندات المطابقة لطلب البحث النصي. لترتيب النتائج تنازليًا حسب درجة المطابقة، استخدِم $meta في عبارة ترتيب. يُرجى الاطّلاع على الأمثلة التالية، حيث SCORE_FIELD هو اسم الحقل المستخدَم لتخزين قيمة النتيجة:

  # Find query
  db.cities
    .find({ $text: { $search: "best french bread" } })
    .sort({ SCORE_FIELD: { $meta: "textScore" } })

  # Aggregation query
  db.cities.aggregate([
    { $match: { $text: { $search: "best french bread" } } },
    { $sort: { "SCORE_FIELD": { $meta: "textScore"} } },
  ]);

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

  # Find query
  db.cities
    .find({ $text: { $search: "best french bread" } })
    .project({ score: { $meta: "textScore" } })

  # Aggregation query
  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.