استخدِم ميزات البحث النصي في Cloud Firestore للبحث عن سلاسل معيّنة ضِمن مجموعة.
قبل البدء
قبل البدء في استخدام عمليات البحث النصي، اتّبِع الخطوات التالية:
تأكَّد من إمكانية الوصول إلى قاعدة بيانات عمليات حالية متوافقة مع MongoDB، أو أنشئ قاعدة بيانات واتصِل بها.
تأكَّد من توفّر فهرس نصي، أو أنشئ فهرسًا نصيًا.
إجراء بحث نصي
تستخدم عمليات البحث النصي عامل التشغيل $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.