استخدِم ميزات البحث النصي في Cloud Firestore للبحث عن سلاسل معيّنة ضمن مجموعة.
قبل البدء
قبل البدء في استخدام طلبات البحث النصية، اتّبِع الخطوات التالية:
تأكَّد من إمكانية الوصول إلى قاعدة بيانات حالية متوافقة مع عمليات MongoDB، أو أنشئ قاعدة بيانات واتّصِل بها.
تأكَّد من توفّر فهرس نصي، أو أنشئ فهرسًا نصيًا.
أذونات "إدارة الهوية وإمكانية الوصول"
لإنشاء فهرس في Cloud Firestore، تأكَّد من أنّك حصلت على أي من الأدوار التالية:
roles/datastore.ownerroles/datastore.indexAdminroles/editorroles/owner
لمنح دور، يُرجى الاطّلاع على منح دور واحد. لمزيد من المعلومات عن أدوار Cloud Firestore والأذونات المرتبطة بها، يُرجى الاطّلاع على الأدوار المُحدَّدة مسبقًا.
إذا كنت قد حدّدت أدوارًا مخصّصة، عليك منح جميع الأذونات التالية لإنشاء الفهارس:
datastore.indexes.createdatastore.indexes.deletedatastore.indexes.getdatastore.indexes.listdatastore.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.