() translation by (you can also view the original English article)
يعد البحث عن النص الكامل أمرًا مهما للسماح للمستخدمين بالتنقل عبر مواقع الويب الغنية بالمحتوى. في هذا المنشور، سأوضح لك كيفية تنفيذ البحث عن النص الكامل لتطبيق Laravel. في الواقع، سنستخدم مكتبة كشاف Laravel، مما يجعل عملية البحث عن النص الكامل سهلة وممتعة.
ما هو بالضبط كشاف Laravel؟ تلخص الوثائق الرسمية الأمر كما يلي:
يوفر كشاف Laravel حلاً بسيطًا يستند إلى برنامج التشغيل لإضافة البحث عن نص كامل إلى نماذج Eloquent. باستخدام مراقبين النموذج، سيحافظ الكشاف بشكل تلقائي على مزامنة فهارس البحث الخاصة بك مع سجلات Eloquent.
أساسا، كشاف Laravel هي مكتبة تدير المعالجة في الفهرس كلما كان هناك تغيير في بيانات النموذج. يعتمد المكان الذي ستتم فهرسته على برنامج التشغيل الذي قمت بتكوينه مع مكتبة الكشاف.
حتى الآن، مكتبة الكشاف تدعم Algolia، وهي عبارة عن API لمحرك البحث تستند إلى سحابة، وهذا ما سنستخدمه في هذه المقالة لشرح تنفيذ البحث بالنص الكامل.
سنبدأ بتثبيت مكتبات خوادم الكشاف و Algolia، ومع المضي قدمًا، سنستعرض مثالًا حقيقيًا لشرح كيف يمكنك فهرسة بياناتك والبحث فيها.
تكوينات الخادم
في هذا القسم، سنقوم بتثبيت التبعيات المطلوبة من أجل جعل مكتبة الكشاف تعمل مع Laravel. بعد التثبيت، سنحتاج إلى إجراء عملية تهيئة بسيطة جدًا حتى يتمكن Laravel من العثور على مكتبة الكشاف.
دعونا نمضي قدما ونثبت مكتبة الكشاف باستخدام الـComposer.
1 |
$composer require laravel/scout
|
هذا جيد لتثبيت مكتبة الكشاف. والآن بعد أن قمنا بتثبيت مكتبة الكشاف، دعونا نتأكد من أن Laravel يعرف ذالك.
من خلال العمل مع Laravel، ربما تكون على دراية بمفهوم مقدم الخدمة، والذي يسمح لك بتكوين الخدمات في تطبيقك. وبالتالي، عندما تريد تمكين خدمة جديدة في تطبيق Laravel، تحتاج فقط إلى إضافة إدخال مقدم خدمة مرتبط في config / app.php
.
إذا لم تكن على دراية بمقدمي خدمة Laravel حتى الآن، فإنني أوصيك بشدة بأن تقدم لنفسك خدمة وتمر عبر هذه المقالة التمهيدية التي تشرح أساسيات مقدمي الخدمات في Laravel.
في حالتنا، نحتاج فقط إلى إضافة موفر ScoutServiceProvider
إلى قائمة موفري الخدمة في config / app.php
، كما هو موضح في المقتطف التالي.
1 |
...
|
2 |
...
|
3 |
'providers' => [ |
4 |
|
5 |
/*
|
6 |
* Laravel Framework Service Providers...
|
7 |
*/
|
8 |
Illuminate\Auth\AuthServiceProvider::class, |
9 |
Illuminate\Broadcasting\BroadcastServiceProvider::class, |
10 |
Illuminate\Bus\BusServiceProvider::class, |
11 |
Illuminate\Cache\CacheServiceProvider::class, |
12 |
Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, |
13 |
Illuminate\Cookie\CookieServiceProvider::class, |
14 |
Illuminate\Database\DatabaseServiceProvider::class, |
15 |
Illuminate\Encryption\EncryptionServiceProvider::class, |
16 |
Illuminate\Filesystem\FilesystemServiceProvider::class, |
17 |
Illuminate\Foundation\Providers\FoundationServiceProvider::class, |
18 |
Illuminate\Hashing\HashServiceProvider::class, |
19 |
Illuminate\Mail\MailServiceProvider::class, |
20 |
Illuminate\Notifications\NotificationServiceProvider::class, |
21 |
Illuminate\Pagination\PaginationServiceProvider::class, |
22 |
Illuminate\Pipeline\PipelineServiceProvider::class, |
23 |
Illuminate\Queue\QueueServiceProvider::class, |
24 |
Illuminate\Redis\RedisServiceProvider::class, |
25 |
Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, |
26 |
Illuminate\Session\SessionServiceProvider::class, |
27 |
Illuminate\Translation\TranslationServiceProvider::class, |
28 |
Illuminate\Validation\ValidationServiceProvider::class, |
29 |
Illuminate\View\ViewServiceProvider::class, |
30 |
|
31 |
/*
|
32 |
* Package Service Providers...
|
33 |
*/
|
34 |
Laravel\Tinker\TinkerServiceProvider::class, |
35 |
|
36 |
/*
|
37 |
* Application Service Providers...
|
38 |
*/
|
39 |
App\Providers\AppServiceProvider::class, |
40 |
App\Providers\AuthServiceProvider::class, |
41 |
App\Providers\BroadcastServiceProvider::class, |
42 |
App\Providers\EventServiceProvider::class, |
43 |
App\Providers\RouteServiceProvider::class, |
44 |
Laravel\Scout\ScoutServiceProvider::class, |
45 |
],
|
46 |
...
|
47 |
...
|
الآن، Laravel على دراية بموفر خدمة ScoutServiceProvider
. تأتي مكتبة Scout مع ملف تكوين يسمح لنا بضبط شهادة API.
دعونا نمضي قدما وننشر ما توفر مكتبة الكشاف باستخدام الأمر التالي.
1 |
$ php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider" |
2 |
Copied File [/vendor/laravel/scout/config/scout.php] To [/config/scout.php] |
3 |
Publishing complete. |
كما ترون، فقد تم نسخ ملف vendor/laravel/scout/config/scout.php
إلى config/scout.php
بعد ذلك، امض قدمًا وأنشئ حسابًا مع Algolia حيث سنحتاج إلى شهادة API في المقام الأول. بمجرد حصولك على معلومات API، دعنا نمضي قدمًا ونقوم بتهيئة الإعدادات الضرورية في ملف config / scout.php
، كما هو موضح في المقتطف التالي.
1 |
<?php
|
2 |
|
3 |
return [ |
4 |
|
5 |
/*
|
6 |
|--------------------------------------------------------------------------
|
7 |
| Default Search Engine
|
8 |
|--------------------------------------------------------------------------
|
9 |
|
|
10 |
| This option controls the default search connection that gets used while
|
11 |
| using Laravel Scout. This connection is used when syncing all models
|
12 |
| to the search service. You should adjust this based on your needs.
|
13 |
|
|
14 |
| Supported: "algolia", "null"
|
15 |
|
|
16 |
*/
|
17 |
|
18 |
'driver' => env('SCOUT_DRIVER', 'algolia'), |
19 |
|
20 |
/*
|
21 |
|--------------------------------------------------------------------------
|
22 |
| Index Prefix
|
23 |
|--------------------------------------------------------------------------
|
24 |
|
|
25 |
| Here you may specify a prefix that will be applied to all search index
|
26 |
| names used by Scout. This prefix may be useful if you have multiple
|
27 |
| "tenants" or applications sharing the same search infrastructure.
|
28 |
|
|
29 |
*/
|
30 |
|
31 |
'prefix' => env('SCOUT_PREFIX', ''), |
32 |
|
33 |
/*
|
34 |
|--------------------------------------------------------------------------
|
35 |
| Queue Data Syncing
|
36 |
|--------------------------------------------------------------------------
|
37 |
|
|
38 |
| This option allows you to control if the operations that sync your data
|
39 |
| with your search engines are queued. When this is set to "true" then
|
40 |
| all automatic data syncing will get queued for better performance.
|
41 |
|
|
42 |
*/
|
43 |
|
44 |
'queue' => env('SCOUT_QUEUE', false), |
45 |
|
46 |
/*
|
47 |
|--------------------------------------------------------------------------
|
48 |
| Chunk Sizes
|
49 |
|--------------------------------------------------------------------------
|
50 |
|
|
51 |
| These options allow you to control the maximum chunk size when you are
|
52 |
| mass importing data into the search engine. This allows you to fine
|
53 |
| tune each of these chunk sizes based on the power of the servers.
|
54 |
|
|
55 |
*/
|
56 |
|
57 |
'chunk' => [ |
58 |
'searchable' => 500, |
59 |
'unsearchable' => 500, |
60 |
],
|
61 |
|
62 |
/*
|
63 |
|--------------------------------------------------------------------------
|
64 |
| Soft Deletes
|
65 |
|--------------------------------------------------------------------------
|
66 |
|
|
67 |
| This option allows you to control whether to keep soft deleted records in
|
68 |
| the search indexes. Maintaining soft deleted records can be useful
|
69 |
| if your application still needs to search for the records later.
|
70 |
|
|
71 |
*/
|
72 |
|
73 |
'soft_delete' => false, |
74 |
|
75 |
/*
|
76 |
|--------------------------------------------------------------------------
|
77 |
| Algolia Configuration
|
78 |
|--------------------------------------------------------------------------
|
79 |
|
|
80 |
| Here you may configure your Algolia settings. Algolia is a cloud hosted
|
81 |
| search engine which works great with Scout out of the box. Just plug
|
82 |
| in your application ID and admin API key to get started searching.
|
83 |
|
|
84 |
*/
|
85 |
|
86 |
'algolia' => [ |
87 |
'id' => env('ALGOLIA_APP_ID', 'STQK4DEGMA'), |
88 |
'secret' => env('ALGOLIA_SECRET', '6ef572194f70201ed7ad102cc9f90e05'), |
89 |
],
|
90 |
|
91 |
];
|
لاحظ أننا قمنا بتعيين قيمة SCOUT_DRIVER
إلى برنامج التشغيل algolia
. وبالتالي، فإنه من الضروري تكوين الإعدادات الضرورية لبرنامج التشغيل Algolia في نهاية الملف. في الأساس، تحتاج فقط إلى تحديد id
وsecret
التي حصلت عليها من حساب Algolia.
كما ترى، نحن نحضر القيم من متغيرات البيئة. لذلك دعونا نتأكد من أننا قمنا بتعيين المتغيرات التالية في ملف .env
بشكل صحيح.
1 |
... |
2 |
... |
3 |
ALGOLIA_APP_ID=STQK4DEGMA |
4 |
ALGOLIA_SECRET=6ef572194f70201ed7ad102cc9f90e05 |
5 |
... |
6 |
... |
وأخيرًا، نحتاج إلى تثبيت Algolia PHP SDK، والذي سيتم استخدامه للتفاعل مع Algolia باستخدام الـAPI. لنقم بتثبيته باستخدام الـcomposer كما هو موضح في المقتطف التالي.
1 |
$composer require algolia/algoliasearch-client-php
|
وبهذا، قمنا بتركيب جميع الاعتماديات اللازمة لنشر البيانات وفهرستها إلى خدمة Algolia.
إنشاء نماذج قابلة للفهرسة و البحث
في القسم السابق، قمنا بكل العمل الشاق لإعداد مكتبات الكشاف وAlgolia حتى نتمكن من فهرسة البيانات والبحث فيها باستخدام خدمة البحث في Algolia.
في هذا القسم، سنتناول مثالاً يوضح كيف يمكنك فهرسة البيانات الموجودة واسترداد نتائج البحث من Algolia. أفترض أن لديك نموذج نشر
افتراضيًا في تطبيقك وهذا ما سنستخدمه في مثالنا.
أول شيء يتعين علينا القيام به هو إضافة سمة Laravel \ Scout \ Searchable
إلى نموذج الـنشر
. وهذا ما يجعل نموذج الـنشر
قابلاً للبحث. يقوم Laravel بمزامنة السجلات المسجلة مع فهرس Algolia في كل مرة يتم فيها إضافة أو تحديث أو حذف سجل النشر.
1 |
<?php
|
2 |
namespace App; |
3 |
|
4 |
use Illuminate\Database\Eloquent\Model; |
5 |
use Laravel\Scout\Searchable; |
6 |
|
7 |
class Post extends Model |
8 |
{
|
9 |
use Searchable; |
10 |
|
11 |
/**
|
12 |
* The attributes that should be mutated to dates.
|
13 |
*
|
14 |
* @var array
|
15 |
*/
|
16 |
protected $dates = [ |
17 |
'created_at', |
18 |
'updated_at'
|
19 |
];
|
20 |
}
|
ومع هذا، فإن نموذج الـنشر
محسن من أجل البحث!
بعد ذلك، نود تهيئة الحقول التي يجب فهرستها في المقام الأول. بالطبع، لا تريد فهرسة جميع حقول النموذج الخاص بك في Algolia للحفاظ على فعاليتها وخفة وزنها. في الواقع، في أكثر الأحيان، لن تحتاج إليها.
يمكنك إضافة toSearchableArray
في فئة النموذج لتكوين الحقول التي سيتم فهرستها.
1 |
/**
|
2 |
* Get the indexable data array for the model.
|
3 |
*
|
4 |
* @return array
|
5 |
*/
|
6 |
public function toSearchableArray() |
7 |
{
|
8 |
$array = $this->toArray(); |
9 |
|
10 |
return array('id' => $array['id'],'name' => $array['name']); |
11 |
}
|
الآن، نحن على استعداد لاستيراد سجلات الـنشر
الموجودة إلى Algolia وفهرستها. في الواقع، تسهل مكتبة الكشاف هذا من خلال توفير الأمر الحرفي التالي.
1 |
$php artisan scout:import "App\Post" |
ينبغي أن تستورد جميع سجلات نموذج الـنشر
في دفعة واحدة! يتم فهرستها بمجرد استيرادها، لذلك نحن جاهزون لاستعلام السجلات بالفعل. المضي قدما واستكشاف لوحة المعلومات Algolia لمشاهدة السجلات المستوردة وغيرها من الخدمات.
كيف يعمل تماما
في هذا القسم، سنقوم بإنشاء مثال يوضح كيفية إجراء عمليات البحث و CRUD التي تتم مزامنتها في الوقت الحقيقي مع فهرس Algolia.
امضي قدما وإنشئ ملف app/Http/Controllers/SearchController.php
مع المحتويات التالية.
1 |
<?php
|
2 |
namespace App\Http\Controllers; |
3 |
|
4 |
use App\Http\Controllers\Controller; |
5 |
use App\Post; |
6 |
|
7 |
class SearchController extends Controller |
8 |
{
|
9 |
public function query() |
10 |
{
|
11 |
// queries to Algolia search index and returns matched records as Eloquent Models
|
12 |
$posts = Post::search('title')->get(); |
13 |
|
14 |
// do the usual stuff here
|
15 |
foreach ($posts as $post) { |
16 |
// ...
|
17 |
}
|
18 |
}
|
19 |
|
20 |
public function add() |
21 |
{
|
22 |
// this post should be indexed at Algolia right away!
|
23 |
$post = new Post; |
24 |
$post->setAttribute('name', 'Another Post'); |
25 |
$post->setAttribute('user_id', '1'); |
26 |
$post->save(); |
27 |
}
|
28 |
|
29 |
public function delete() |
30 |
{
|
31 |
// this post should be removed from the index at Algolia right away!
|
32 |
$post = Post::find(1); |
33 |
$post->delete(); |
34 |
}
|
35 |
}
|
بالطبع، نحن بحاجة إلى إضافة المسارات المرتبطة كذلك.
1 |
Route::get('search/query', 'SearchController@query'); |
2 |
Route::get('search/add', 'SearchController@add'); |
3 |
Route::get('search/delete', 'SearchController@delete'); |
دعونا نذهب من خلال طريقة query
لمعرفة كيفية إجراء بحث في Algolia.
1 |
public function query() |
2 |
{
|
3 |
// queries to Algolia search index and returns matched records as Eloquent Models
|
4 |
$posts = Post::search('title')->get(); |
5 |
|
6 |
// do the usual stuff here
|
7 |
foreach ($posts as $post) { |
8 |
// ...
|
9 |
}
|
10 |
}
|
تذكر أننا جعلنا نموذج الـنشر
قابلاً للبحث عن طريق إضافة سمة قابلة للبحث
. وبالتالي، يمكن لنموذج الـنشر
استخدام طريقة البحث
لاسترداد السجلات من فهرس Algolia. في المثال أعلاه، نحاول جلب السجلات التي تطابق الكلمة المفتاح للعنوان
.
بعد ذلك، هناك طريقة الـإضافة
التي تقلد سير العمل لإضافة سجل نشر جديد.
1 |
public function add() |
2 |
{
|
3 |
// this post should be indexed at Algolia right away!
|
4 |
$post = new Post; |
5 |
$post->setAttribute('name', 'Another Post'); |
6 |
$post->setAttribute('user_id', '1'); |
7 |
$post->save(); |
8 |
}
|
لا يوجد شيء وهمي في التعليمات البرمجية أعلاه؛ ينشئ فقط سجل نشر جديد باستخدام نموذج الـنشر
. لكن نموذج الـنشر
ينفذ السمات القابلة للبحث
، لذا يقوم Laravel بعمل إضافي هذه المرة من خلال فهرسة السجل الذي تم إنشاؤه حديثًا في Algolia. كما ترون، تتم الفهرسة في الوقت الفعلي.
أخيراً، هناك طريقة الـحذف
. دعونا نذهب من خلالها كذلك.
1 |
public function delete() |
2 |
{
|
3 |
// this post should be removed from the index at Algolia right away!
|
4 |
$post = Post::find(1); |
5 |
$post->delete(); |
6 |
}
|
كما كنت تتوقع، يتم حذف السجل مباشرة من مؤشر Algolia بمجرد حذفه من قاعدة البيانات.
في الأساس، ليس هناك جهد إضافي مطلوب من جانبك إذا كنت ترغب في جعل النماذج الحالية قابلة للبحث. يتم التعامل مع كل شيء من قبل مكتبة الكشاف باستخدام مراقبين النموذج.
وهذا أيضا يقودنا إلى نهاية هذه المقالة!
خاتمة
اليوم ، ناقشنا كيف يمكنك تنفيذ البحث عن النص الكامل في Laravel باستخدام مكتبة كشاف Laravel. في هذه العملية، مررنا بالتجهيزات الضرورية ونموذجًا واقعيًا لإثبات ذلك.
لا تتردد في السؤال إذا كانت لديك أي استفسارات أو شكوك باستخدام موجز التعليقات أدناه!