مقدمة إلى البحث النصي الكامل وMongoDB Atlas Search #
في تطبيقات اليوم الغنية بالبيانات، تعد ميزة البحث القوية والدقيقة أمرًا بالغ الأهمية. يتوقع المستخدمون نتائج سريعة وذات صلة، حتى عند التعامل مع كميات كبيرة من النصوص غير المهيكلة. غالبًا ما تقصر استعلامات قواعد البيانات التقليدية عن تحقيق ذلك، مما يؤدي إلى اعتماد محركات البحث النصي الكامل.
يوفر MongoDB Atlas Search، المبني على Apache Lucene، حلاً قويًا ومدارًا بالكامل للبحث النصي الكامل يتكامل بسلاسة مع بيانات MongoDB الخاصة بك. يوفر ميزات متقدمة مثل تسجيل الملاءمة BM25 ووزن الحقول (Field Weighting)، مما يسمح للمطورين بضبط جودة نتائج البحث بدقة. سيرشدك هذا البرنامج التعليمي خلال تنفيذ وتحسين البحث النصي الكامل في تطبيق Laravel الخاص بك باستخدام MongoDB Atlas Search.
المتطلبات الأساسية #
قبل أن نبدأ، تأكد من توفر ما يلي:
- مشروع Laravel موجود أو جديد.
- حساب MongoDB Atlas ومجموعة (Cluster) تم نشرها. إذا لم يكن لديك حساب، سجل للحصول على مجموعة مجانية.
- حزمة jenssegers/laravel-mongodb مثبتة في مشروع Laravel الخاص بك لتكامل MongoDB.
الخطوة 1: إعداد فهرس البحث في MongoDB Atlas #
يكمن جوهر MongoDB Atlas Search في فهارسها. تحدد هذه الفهارس الحقول القابلة للبحث، وكيفية تحليلها، وكيفية تسجيل الملاءمة. سنقوم بإنشاء فهرس أساسي ثم تحسينه لضبط الملاءمة.
1. انتقل إلى واجهة Atlas وقم بإنشاء فهرس #
- سجل الدخول إلى حساب MongoDB Atlas الخاص بك.
- انتقل إلى مجموعتك المطلوبة.
- في الشريط الجانبي الأيسر، انقر على 'Search'.
- انقر على 'Create Search Index'.
- اختر 'JSON Editor' ثم انقر على 'Next'.
- حدد قاعدة البيانات والمجموعة الخاصة بك (على سبيل المثال،
your_db.products). - سمِ الفهرس الخاص بك (على سبيل المثال،
defaultأوproduct_search). - الصق تكوين JSON التالي:
{
"mappings": {
"dynamic": false,
"fields": {
"name": {
"type": "string",
"analyzer": "lucene.standard",
"searchAnalyzer": "lucene.standard"
},
"description": {
"type": "string",
"analyzer": "lucene.standard",
"searchAnalyzer": "lucene.standard"
}
}
},
"synonyms": [
{
"name": "product_synonyms",
"source": {
"collection": "product_synonyms_collection"
}
}
]
}
يجعل هذا التكوين الأساسي حقلي name و description قابلين للبحث. تضمن dynamic: false فهرسة الحقول المعرفة صراحةً فقط، وهي ممارسة جيدة للتحكم. لقد أدرجنا أيضًا عنصرًا نائبًا للمترادفات، والتي يمكن تعريفها في مجموعة منفصلة.
2. فهم فهرسة BM25 #
بشكل افتراضي، يستخدم MongoDB Atlas Search خوارزمية BM25 (Best Match 25) لتسجيل الملاءمة. BM25 هي دالة ترتيب تستخدمها محركات البحث لتقدير مدى ملاءمة المستندات لاستعلام بحث معين. وتأخذ في الاعتبار عوامل مثل:
- تكرار المصطلح (Term Frequency - TF): عدد مرات ظهور مصطلح في مستند.
- تكرار المستند العكسي (Inverse Document Frequency - IDF): مدى ندرة المصطلح عبر جميع المستندات (المصطلحات النادرة تكون أكثر أهمية).
- طول المستند: قد تعتبر المستندات الأقصر التي تتطابق مع الاستعلام أكثر ملاءمة من المستندات الأطول (بشكل موحد).
لا تقوم عادةً بتكوين BM25 مباشرةً، بل تؤثر على معاييره من خلال وزن الحقول، والذي سنتناوله لاحقًا.
الخطوة 2: دمج MongoDB مع Laravel #
بافتراض أنك قمت بتثبيت وتهيئة jenssegers/laravel-mongodb:
1. تهيئة قاعدة البيانات #
تأكد من أن ملف .env الخاص بك يحتوي على تفاصيل اتصال MongoDB الصحيحة:
DB_CONNECTION=mongodb
DB_HOST=your_atlas_host
DB_PORT=27017
DB_DATABASE=your_db_name
DB_USERNAME=your_username
DB_PASSWORD=your_password
MONGODB_SRV=true # Set to true if using SRV record connection string
2. إنشاء نموذج Laravel (Model) #
أنشئ نموذجًا لمجموعتك، على سبيل المثال، Product.php:
<?php
namespace App\Models;
use Jenssegers\Mongodb\Eloquent\Model;
class Product extends Model
{
protected $connection = 'mongodb';
protected $collection = 'products'; // اسم مجموعتك
protected $fillable = [
'name',
'description',
'category',
'price'
];
}
الخطوة 3: إجراء عمليات البحث النصي الكامل في Laravel #
لإجراء بحث باستخدام MongoDB Atlas Search، ستستخدم عادةً مسار التجميع (aggregation pipeline) مع عامل التشغيل $search.
مثال على استعلام البحث #
use App\Models\Product;
class ProductController extends Controller
{
public function search(Request $request)
{
$query = $request->input('q');
if (empty($query)) {
return response()->json([]);
}
$products = Product::raw(function($collection) use ($query) {
return $collection->aggregate([
[
'$search' => [
'index' => 'product_search', // اسم فهرس البحث الخاص بك
'text' => [
'query' => $query,
'path' => ['name', 'description'] // الحقول المراد البحث فيها
]
]
],
[
'$project' => [
'name' => 1,
'description' => 1,
'category' => 1,
'price' => 1,
'score' => [ '$meta' => 'searchScore' ] // تضمين درجة البحث
]
],
['$sort' => ['score' => -1]], // الفرز حسب الملاءمة
['$limit' => 10]
]);
});
return response()->json($products);
}
}
في هذا المثال:
- يبدأ عامل التشغيل
$searchاستعلام Atlas Search. - يحدد
indexفهرس Atlas Search الذي سيتم استخدامه. - يحدد
textاستعلام بحث نصي: queryهو مصطلح البحث.pathيحدد الحقول للبحث فيها.- يستخدم
$projectلتشكيل الإخراج، مع تضمين$meta: 'searchScore'بشكل حاسم لاسترداد درجة الملاءمة. - يقوم
$sortبترتيب النتائج حسب الدرجة بترتيب تنازلي، لإظهار الأكثر صلة أولاً.
الخطوة 4: فن الملاءمة: وزن الحقول #
بينما يوفر BM25 أساسًا جيدًا، غالبًا ما تحتاج إلى إخبار محرك البحث بأن بعض الحقول أهم من غيرها. هنا يأتي دور وزن الحقول. على سبيل المثال، قد يكون التطابق في name المنتج أكثر أهمية من التطابق في description.
تعديل فهرس Atlas Search لوزن الحقول #
ارجع إلى تكوين فهرس Atlas Search وقم بتعديل JSON لإضافة weight إلى حقل name:
{
"mappings": {
"dynamic": false,
"fields": {
"name": {
"type": "string",
"analyzer": "lucene.standard",
"searchAnalyzer": "lucene.standard",
"weight": {
"score": 2 // إعطاء حقل 'name' وزنًا قدره 2
}
},
"description": {
"type": "string",
"analyzer": "lucene.standard",
"searchAnalyzer": "lucene.standard"
}
}
}
}
من خلال تعيين "weight": {"score": 2} لحقل name، ستساهم التطابقات الموجودة في حقل name بضعف ما تساهم به التطابقات في حقل description في درجة الملاءمة الإجمالية. يؤثر هذا بشكل مباشر على حساب BM25، مما يجعل النتائج التي يظهر فيها مصطلح البحث في الاسم تحتل مرتبة أعلى.
التأثير على نتائج البحث #
مع تطبيق وزن الحقول، إذا بحث مستخدم عن "أحذية حمراء":
- من المرجح أن يحتل منتج باسم "أحذية حمراء فاخرة" مرتبة أعلى من منتج باسم "أحذية مشي فاخرة" تظهر فيه كلمة "أحمر" مرة واحدة فقط في وصفه الطويل.
- يمكن أن يؤدي هذا التعديل البسيط إلى تحسين تجربة المستخدم بشكل كبير من خلال عرض العناصر الأكثر صلة أولاً، بناءً على منطق عمل تطبيقك المحدد وتسلسل المحتوى الهرمي.
يمكنك تجربة قيم وزن مختلفة (على سبيل المثال، 0.5، 1.5، 3) لضبط النتائج بدقة للحقول المختلفة في مستنداتك.
مواضيع متقدمة (باختصار) #
- البحث الغامض (Fuzzy Search): استخدم عامل التشغيل
fuzzyداخلtextلتحمل الأخطاء الإملائية. - الإكمال التلقائي (Auto-Completion): استخدم عامل التشغيل
autocompleteلاقتراحات الكتابة المسبقة. - المرادفات (Synonyms): قم بتوسيع نطاق البحث عن طريق تعريف خرائط المرادفات في Atlas.
- المحللات المخصصة (Custom Analyzers): أنشئ محللات نصية متخصصة لمعالجة خاصة باللغة أو حالات استخدام معينة.
- التظليل (Highlighting): استخدم خيار
highlightفي$searchلإظهار مقتطفات من النص المطابق.
الخاتمة #
يرفع تنفيذ البحث النصي الكامل في Laravel باستخدام MongoDB Atlas Search من قدرات البحث في تطبيقك من التصفية الأساسية إلى الاكتشاف الذكي الموجه بالملاءمة. من خلال فهم واستخدام فهرسة BM25 ووزن الحقول، يمكنك التحكم بدقة في كيفية ترتيب نتائج البحث الخاصة بك، مما يضمن أن يجد المستخدمون دائمًا ما يبحثون عنه بكفاءة. جرب تكوينات الفهرس المختلفة وهياكل الاستعلام لاكتشاف الملاءمة المثلى لاحتياجات تطبيقك المحددة.