
اگر تجربهی کار با elasticsearch در لاراول رو داشته باشین احتمالا میدانید که یک پکیج (درایور) خوب برای اتصال لاراول به elasticsearch وجود ندارد و پکیجهای موجود کارایی لازم رو ندارند و همچنین کانفیگ سختی هم دارند. شاید این یکی از ضعفهای لاراول بود.
خب خبر خوب اینجاست که توسعه دهندگان لاراول یک درایور خوب با نام Explorer برای اتصال لاراول به الستیکسرچ ایجاد کردن که من میخوام بهتون معرفیش کنم و آموزش نحوهی کار با اون رو بهتون یاد بدم.
قبل از شروع آموزش باید بگم که elasticsesarch باید بر روی سیستم شما نصب باشد.
اگر روش نصب elasticsearch بر روی سیستم خود را یاد ندارید میتوانید از طریق لینک زیر برای نصب آن اقدام کنید.
در ابتدا که شما لاراول را نصب می کنید یک مدل پیشفرض با نام User برای شما ایجاد میشود.
برای مثال ما میخواهیم این مدل را به الستیکسرچ متصل کنیم.
پس از نصب لاراول و ایجاد جداول با دستور php artisan migrate میریم سراغ نصب پکیج Explorer
با دستور زیر پکیج را نصب کنید و فایل پیکربندی آن را ایجاد کنید.
composer require jeroen-g/explorer //and php artisan vendor:publish --tag=explorer.config
حال به آدرس config/explorer.php بروید و مقدار indexes را به صورت زیر تغییر دهید.
در اینجا شما نام ستونهای جدول users را باید وارد کنید. (برای مثال من فقط نام چهار ستون را وارد کردم)
'indexes' => [ \App\Models\User::class, 'subscribers' => [ 'properties' => [ 'id' => 'keyword', 'name' => 'text', 'email' => 'text', 'created_at' => 'date', ], ], ],
همانطور که احتمالا میدانید explorer یک درایور برای پکیج Scout لاراول است در نتیجه ما برای کار با الستیک به این پکیج قدرتمند لاراول نیاز داریم پس در گام دوم میریم سراغ نصب Laravel Scout:
با دستورات زیر پکیج را نصب و فایل پیکربندی آن را ایجاد کنید.
composer require laravel/scout //and php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
پس از اجرای دستورات فوق یک فایل در آدرس config/scout.php برای شما ایجاد شده است.
وارد فایل شوید و مقدار queue و driver را که به صورت پیشفرض algolia قرار دارد را به elastic تغییر دهید.
'driver' => env('SCOUT_DRIVER', 'elastic'), //and 'queue' => env('SCOUT_QUEUE', true),
حال وارد مدل user شوید و searchable را در مدل خود use کنید و کلاس User را از اینترفیس Explored ایمپلیمنت کنید. پس از اینکار یک متود با نام mappableAs برای شما ایجاد میشود که در اینجا هم باید نام ستونهای جدول یوزر را return کنید. (مانند زیر)
use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use JeroenG\Explorer\Application\Explored; use Laravel\Scout\Searchable; class User extends Authenticatable implements Explored { use HasFactory, Notifiable, Searchable; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'name', 'email', 'password', ]; /** * The attributes that should be hidden for arrays. * * @var array */ protected $hidden = [ 'password', 'remember_token', ]; /** * The attributes that should be cast to native types. * * @var array */ protected $casts = [ 'email_verified_at' => 'datetime', ]; public function mappableAs(): array { return [ 'id' => 'keyword', 'name' => 'text', 'email' => 'text', 'created_at' => 'date', ]; } }
سپس دستور زیر را وارد کنید تا سوابق جدول یوزر به scout اضافه شود.
php artisan scout:import "App\Models\User"
همچنین با اجرای دستورات زیر میتوانید تنظیمات مربوط به سرور elasticsearch را مدیریت کنید.
# create indexes php artisan elastic:create # delete indexes php artisan elastic:delete # search indexes php artisan elastic:search "App\Models\User" lorem
به یاد داشته باشید که در ابتدای کار حتما باید دستور php artisan elastic:create را وارد کنید.
خب تقریبا کار به اتمام رسیده و از اینجا به بعد یک رکورد در جدول یوزر ایجاد میکنیم و نتیجهی آن را در الستیک جستجو میکنیم. برای اینکار به فایل web.php رفته و یک روت مانند زیر ایجاد میکنیم و یک داده در جدول ذخیره میکنیم. (برای ثبت داده های بیشتر میتوانید از seeder های لاراول بهره بگیرید)
Route::get('/', function () { $user = new \App\Models\User(); $user->name = 'john'; $user->email = "john@gamil.com" $user->password = \Illuminate\Support\Facades\Hash::make('12345678'); $user->save(); if ($user) return "success" return 'Unsuccessful'; });
حالا میتوانیم با دستورات زیر دادهی های موجود در مدل یوزر یا هر مدل دیگری که به الستیکسرچ متصل باشد را جستجو کنیم.
$users = \App\Models\User::search('john')->get(); //or $users = \App\Models\User::search('email:(john@gamil.com)')->get(); //or \App\Models\ModelName::search('phone') // specify columns to select ->select(['title', 'price']) // filter ->where('color', 'red') // sort ->orderBy('price', 'asc') // collapse by field ->collapse('brand') // set offset ->from(0) // set limit ->take(10) // get results ->get(); //or $posts = Post::search('lorem') ->must(new Matching('title', 'ipsum')) ->should(new Terms('tags', ['featured'], 2)) ->filter(new Term('published', true)) ->get();
امیدوارم آموزش مفید بوده باشه اگر سوالی داشتید در کامنتها مطرح کنید اگر بلد بودم حتما پاسخ خواهم داد.