توفر هذه الحزمة برنامج تشغيل Generic Laravel Scout يقوم بالبحث عن النص الكامل على بيانات النموذج المفهرس باستخدام قاعدة بيانات SQL كواجهة خلفية للتخزين. يتم تخزين البيانات المفهرسة في شكل طبيعي ، مما يسمح بالبحث الفعال والغامض الذي لا يتطلب مطابقة كاملة و/أو دقيقة.
هذا السائق هو بديل لـ teamtnt/laravel-scout-tntsearch-driver . الفرق الأساسي هو أن هذا السائق يوفر عددًا أقل من الميزات (مثل البحث الجغرافي). بدلاً من ذلك ، يعمل مع جميع أنظمة قاعدة البيانات التي يدعمها Laravel نفسها (والتي هي أساسا جميع برامج تشغيل PDO). أيضا ، خوارزمية البحث مختلفة قليلا.
يتم إجراء جميع الاختبارات من خلال إجراءات github لـ PHP 8.0 و 8.1 و 8.2 على أنظمة قاعدة البيانات التالية:
ترتبط القيود الفعلية المتعلقة بأنظمة قاعدة البيانات المدعومة في الغالب باستخدام تعبير الجدول الشائع باستخدام StaudenMeir/Laravel-CTE. يرجى التأكد من دعم نظام قاعدة البيانات الخاص بك قبل استخدام الحزمة ، أو يمكنك تشغيل أخطاء قاعدة البيانات.
يمكنك تثبيت الحزمة عبر الملحن:
composer require namoshek/laravel-scout-databaseبعد تثبيت الحزمة ، يجب نشر ملف التكوين وكذلك الترحيل:
php artisan vendor:publish --provider= " NamoshekScoutDatabaseScoutDatabaseServiceProvider " --tag= " config "
php artisan vendor:publish --provider= " NamoshekScoutDatabaseScoutDatabaseServiceProvider " --tag= " migrations " إذا كنت ترغب في استخدام بادئة جدول مختلفة عن scout_ للجداول التي تم إنشاؤها بواسطة هذه الحزمة ، فيجب عليك تغيير التكوين وكذلك الترحيل النسخ وفقًا لذلك. عندما تفعل ذلك ، يمكنك بعد ذلك تطبيق ترحيل قاعدة البيانات:
php artisan migratev0.x إلى v1.x مع الإصدار الجديد ، تغير مخطط قاعدة البيانات ويجب نشر الترحيل الجديدة باستخدام:
php artisan vendor:publish --provider= " NamoshekScoutDatabaseScoutDatabaseServiceProvider " --tag= " migrations "تنطبق نفس التلميح كما هو مذكور أعلاه في قسم التثبيت على الترحيل المنشور حديثًا أيضًا.
تم تقليل التكوين بشكل طفيف وقد ترغب في مقارنة ملف التكوين الجديد مع الفصل القديم لإزالة الإعدادات القديمة. تخطي هذا الجزء ليس له أي تأثير سلبي على أداء سائق الكشافة.
تمت إزالة أمر NamoshekScoutDatabaseCommandsCleanWordsTable::class ويجب عليك عدم جدولة ذلك ، إذا قمت بإضافته مسبقًا.
تم تغيير معظم حوادث الحقول والأساليب protected إلى private لتبسيط التنمية فيما يتعلق بالتغييرات المتوقفة في التوافق في المستقبل. إذا لم تكن قد تجاوزت أجزاء التنفيذ بنشاط ، فهذا لا يؤثر عليك على الإطلاق.
من أجل توجيه Scout لاستخدام برنامج التشغيل الذي توفره هذه الحزمة ، تحتاج إلى تغيير خيار driver في config/scout.php إلى database . إذا لم تقم بتغيير ملف تكوين SCOUT ، فيمكنك أيضًا تعيين متغير بيئة SCOUT_DRIVER على database بدلاً من ذلك.
يمكن العثور على جميع خيارات التكوين المتاحة للحزمة نفسها في config/scout-database.php . يتم وصف الخيارات بدقة في الملف نفسه. بشكل افتراضي ، تستخدم الحزمة UnicodeTokenizer و PorterStemmer المناسبة للغة الإنجليزية. يضيف البحث بطاقة Wildcard Threading إلى الرمز المميز الأخير وليس هناك حاجة إلى جميع مصطلحات البحث من أجل ظهور مستند في النتائج (يجب أن تكون هناك مباراة واحدة على الأقل).
يمكنك أيضًا إضافة بطاقة Wildcard إلى كل رمز بحث عن طريق تمكين wildcard_all_tokens في ملف config altough هذا لا ينصح به لأسباب الأداء.
من المحتمل ألا يتطلب منك التثبيت الأساسي تغيير أي من هذه الإعدادات. فقط للتأكد من ذلك ، يجب أن تلقي نظرة على خيار connection . إذا كنت ترغب في تغيير هذا ، فقم بذلك قبل تشغيل الترحيل أو سيتم إنشاء الجداول باستخدام اتصال قاعدة البيانات الخاطئة.
حاليا ، فقط UnicodeTokenizer متاح. سوف يقسم الأوتار في أي حرف ليس حرفًا ، ولا رقمًا وفقًا لأنماط p{L} و p{N} . هذا يعني أن النقاط ، والكولون ، والشرطات ، والمساحة البيضاء ، وما إلى ذلك هي معايير تقسيم.
إذا كان لديك متطلبات مختلفة لـ Tokenizer ، فيمكنك توفير تطبيقك الخاص عبر التكوين. فقط تأكد من أنها تنفذ واجهة Tokenizer .
حاليًا ، تتوفر جميع الجذعية التي تنفذها حزمة wamania/php-stemmer . تمت إضافة فئة غلاف لكل منهم:
DanishStemmerDutchStemmerEnglishStemmerFrenchStemmerGermanStemmerItalianStemmerNorwegianStemmerNullStemmer (يمكن استخدامه لتعطيل التنقيب)PorterStemmer (افتراضي ، مثل EnglishStemmer )PortugueseStemmerRomanianStemmerRussianStemmerSpanishStemmerSwedishStemmer إذا كان لديك متطلبات مختلفة لـ STEMMER ، فيمكنك توفير تطبيقك الخاص عبر التكوين. فقط تأكد من أنها تنفذ واجهة Stemmer .
تتبع الحزمة حالات الاستخدام المتاحة الموضحة في وثائق الكشفية الرسمية. يرجى أن تكون على علم بالقيود المدرجة على الرغم من.
يستخدم برنامج البحث داخليًا جدولًا واحدًا ، والذي يحتوي على مصطلحات والرابطة للوثائق. عند فهرسة المستندات (أي إضافة أو تحديث النماذج في فهرس البحث) ، سيستخدم المحرك الرمز المميز الذي تم تكوينه لتقسيم إدخال كل عمود إلى رموز. يقوم الرمز المميز الذي تم تكوينه افتراضيًا ببساطة بتقسيم المدخلات إلى كلمات تتكون من أي حرف أو رقم Unicode ، مما يعني أي حرف آخر مثل , . ، - ، _ ، ! ، ? ، / ، تُعتبر المساحة البيضاء وجميع الشخصيات الخاصة الأخرى فواصل للرموز وسيتم إزالتها بواسطة الرمز المميز. بهذه الطريقة لن ينتهي هذه الشخصيات أبدًا في فهرس البحث نفسه.
بعد أن تم تصميم المدخلات ، يتم تشغيل كل رمز (وفي هذه المرحلة نتوقع بالفعل أن تكون الرموز المميزة لدينا) من خلال الجذعية المكونة لاسترداد الجذع (أي كلمة الجذر ). إن أداء هذا الإجراء يسمح لنا بالبحث عن كلمات مماثلة لاحقًا. سيؤدي PorterStemmer على سبيل المثال إلى إنتاج intellig كإخراج لكل من intelligent intelligence كمدخلات. كيف يساعد هذا عند البحث سيكون واضحًا في لحظة.
أخيرًا ، يتم تخزين نتائج هذه العملية في قاعدة البيانات. تمتلئ جدول الفهرس بنتائج عملية التنقيب والجمعيات إلى النماذج المفهرسة (نوع النموذج ومعرف). علاوة على ذلك ، لكل صف في الفهرس ، تحتوي قاعدة البيانات أيضًا على عدد الأحداث في المستند. نستخدم هذه المعلومات للتسجيل داخل جزء البحث من محركنا.
عند تنفيذ استعلام بحث ، يتم تطبيق نفس عملية الرمز المميز والنزث كما هو مستخدم للفهرسة على سلسلة استعلام البحث. نتيجة هذه العملية هي قائمة بالسيقان (أو الكلمات الجذرية ) التي يتم استخدامها بعد ذلك لإجراء البحث الفعلي. اعتمادًا على تكوين الحزمة ، سيقوم البحث بإرجاع المستندات التي تحتوي على واحد أو كل السيقان على الأقل. يتم ذلك عن طريق حساب درجة لكل مباراة في الفهرس استنادًا إلى تردد المستند العكسي (أي النسبة بين المستندات المفهرسة والمستندات التي تحتوي على إحدى الكلمات التي تم تفتيشها) ، ومصطلح التردد (أي عدد حوادث مصطلح البحث داخل مستند) والانحراف المصطلح (وهو أمر مهم فقط لبحث Wildcard). يتم إرجاع المستندات التي تم طلبها من خلال درجاتها في ترتيب تنازلي ، حتى يتم الوصول إلى الحد المطلوب.
من الممكن تمديد جدول فهرس البحث ( scout_index ) مع أعمدة مخصصة. أثناء الفهرسة ، قد يتم ملء هذه الأعمدة بمحتوى مخصص وأثناء البحث ، يمكن تحديد مقطع البحث لهذه الأعمدة (المطابقة الدقيقة). هذه الميزة مفيدة بشكل خاص عند العمل مع تطبيق متعدد المستأجرين حيث يتم استخدام فهرس البحث من قبل العديد من المستأجرين.
في مثالنا ، نضيف عمود tenant_id إلزامي إلى فهرس البحث.
return new class extends Migration {
public function up (): void
{
Schema :: table ( ' scout_index ' , function ( Blueprint $ table ) {
$ table -> uuid ( ' tenant_id ' );
});
}
public function down (): void
{
Schema :: table ( ' scout_index ' , function ( Blueprint $ table ) {
$ table -> dropColumn ([ ' tenant_id ' ]);
});
}
}; تتم إضافة tenant_id أثناء الفهرسة لكل نموذج:
class User extends Model
{
public function toSearchableArray (): array
{
return [
' id ' => $ this -> id ,
' name ' => $ this -> name ,
' tenant_id ' => new StandaloneField ( $ this -> tenant_id ),
];
}
} يتم ترشيح tenant_id أثناء البحث بناءً على $tenantId ، والتي قد تؤخذ على سبيل المثال من طلب HTTP:
User :: search ( ' Max Mustermann ' )
-> where ( ' tenant_id ' , $ tenantId )
-> get ();من الواضح أن هذه الحزمة لا توفر محرك بحث (حتى عن بُعد) يجلب الأداء والجودة محرك بحث احترافي مثل عروض Elasticsearch. يهدف هذا الحل إلى مشاريع أصغر إلى متوسطة الحجم والتي تحتاج إلى حل بسيط إلى حد ما.
تجدر الإشارة أيضًا إلى أن ميزات الكشافة التالية لا يتم تنفيذها حاليًا:
User::search('Mustermann')->within('users_without_admins')User::search('Musterfrau')->orderBy('age', 'desc')تتمثل إحدى المشكلات في محرك البحث هذا إلى أنه يمكن أن يؤدي إلى مشكلات إذا عملت العديد من عمال قائمة الانتظار على فهرسة وثيقة واحدة بشكل متزامن (ستكون قاعدة البيانات تميت). للتحايل على هذه المشكلة ، يكون عدد المحاولات المستخدمة للمعاملات قابلة للتكوين. بشكل افتراضي ، تتم تجربة كل معاملة بحد أقصى ثلاث مرات في حالة حدوث طريق مسدود (أو أي خطأ آخر).
ترخيص معهد ماساتشوستس للتكنولوجيا (MIT). يرجى الاطلاع على ملف الترخيص لمزيد من المعلومات.