لاراول اسکاوت
معرفی
Laravel Scout یک راه حل ساده و مبتنی بر درایور برای افزودن جستجوی متن کامل به مدل های Eloquent شما ارائه می دهد . با استفاده از ناظران مدل، Scout به طور خودکار فهرست های جستجوی شما را با سوابق Eloquent شما هماهنگ می کند.
در حال حاضر، Scout با رانندگان Algolia و MeiliSearch ارسال می شود . علاوه بر این، Scout شامل یک درایور "مجموعه" است که برای استفاده توسعه محلی طراحی شده است و به هیچ گونه وابستگی خارجی یا خدمات شخص ثالث نیاز ندارد. علاوه بر این، نوشتن درایورهای سفارشی ساده است و شما می توانید Scout را با پیاده سازی های جستجوی خود گسترش دهید.
نصب و راه اندازی
ابتدا Scout را از طریق مدیریت بسته Composer نصب کنید:
composer require laravel/scout
پس از نصب Scout، باید فایل پیکربندی Scout را با استفاده از
vendor:publish
دستور Artisan منتشر کنید.
scout.php
این دستور فایل پیکربندی را در دایرکتوری برنامه شما
منتشر می کند
config
:
php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
در نهایت،
Laravel\Scout\Searchable
ویژگی را به مدلی که میخواهید قابل جستجو کنید، اضافه کنید.
این ویژگی یک ناظر مدل را ثبت می کند که به طور خودکار مدل را با درایور
جستجوی شما هماهنگ می کند:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model;use Laravel\Scout\Searchable; class Post extends Model{ use Searchable;}
پیش نیاز راننده
الگوليا
هنگام استفاده از درایور Algolia، باید Algolia
id
و
secret
اعتبارنامه خود را در
config/scout.php
فایل پیکربندی خود پیکربندی کنید.
هنگامی که اعتبار شما پیکربندی شد، همچنین باید Algolia PHP SDK را از طریق
مدیر بسته Composer نصب کنید:
composer require algolia/algoliasearch-client-php
MeiliSearch
MeiliSearch یک موتور جستجوی فوق العاده سریع و منبع باز است. اگر مطمئن نیستید که چگونه MeiliSearch را بر روی دستگاه محلی خود نصب کنید، می توانید از Laravel Sail ، محیط توسعه Docker لاراول که به طور رسمی پشتیبانی می شود، استفاده کنید.
هنگام استفاده از درایور MeiliSearch، باید MeiliSearch PHP SDK را از طریق مدیر بسته Composer نصب کنید:
composer require meilisearch/meilisearch-php http-interop/http-factory-guzzle
سپس،
SCOUT_DRIVER
متغیر محیطی و همچنین MeiliSearch
host
و
key
اعتبارنامه خود را در فایل برنامه خود تنظیم کنید
.env
:
SCOUT_DRIVER=meilisearchMEILISEARCH_HOST=http://127.0.0.1:7700MEILISEARCH_KEY=masterKey
برای اطلاعات بیشتر در مورد MeiliSearch، لطفاً به مستندات MeiliSearch مراجعه کنید .
meilisearch/meilisearch-php
علاوه بر این، باید با بررسی
اسناد MeiliSearch در مورد سازگاری
باینری ، اطمینان حاصل کنید که نسخهای از آن را نصب میکنید که با نسخه
باینری MeiliSearch سازگار است
.
هنگام ارتقاء Scout در برنامهای که از MeiliSearch استفاده میکند، همیشه باید هرگونه تغییر اضافی در خود سرویس MeiliSearch را بررسی کنید.
در صف
در حالی که به شدت برای استفاده از Scout الزامی نیست، باید به شدت قبل از استفاده از کتابخانه پیکربندی درایور صف را در نظر بگیرید. اجرای یک queue worker به Scout اجازه میدهد تا تمام عملیاتی را که اطلاعات مدل شما را با فهرستهای جستجوی شما همگامسازی میکنند در صف قرار دهد، و زمان پاسخدهی بسیار بهتری را برای رابط وب برنامه شما فراهم میکند.
هنگامی که یک درایور صف را پیکربندی کردید، مقدار گزینه موجود در
فایل پیکربندی
queue
خود را به صورت زیر تنظیم کنید
:
config/scout.php
true
'queue' => true,
پیکربندی
پیکربندی شاخص های مدل
هر مدل Eloquent با یک «شاخص» جستجوی مشخص همگامسازی میشود که شامل تمام
رکوردهای قابل جستجو برای آن مدل است.
به عبارت دیگر، شما می توانید هر شاخص را مانند یک جدول MySQL در نظر
بگیرید.
بهطور پیشفرض، هر مدل برای شاخصی که با نام «جدول» معمولی مدل مطابقت
دارد، حفظ میشود.
به طور معمول، این شکل جمع نام مدل است.
searchableAs
با این حال، شما آزاد هستید که با نادیده گرفتن روش روی مدل،
شاخص مدل را سفارشی کنید :
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model;use Laravel\Scout\Searchable; class Post extends Model{ use Searchable; /** * Get the name of the index associated with the model. * * @return string */ public function searchableAs() { return 'posts_index'; }}
پیکربندی داده های قابل جستجو
به طور پیش فرض، کل
toArray
فرم یک مدل داده شده در فهرست جستجوی آن باقی می ماند.
اگر میخواهید دادههایی را که با فهرست جستجو همگامسازی میشوند سفارشی
کنید، میتوانید
toSearchableArray
روش موجود در مدل را لغو کنید:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model;use Laravel\Scout\Searchable; class Post extends Model{ use Searchable; /** * Get the indexable data array for the model. * * @return array */ public function toSearchableArray() { $array = $this->toArray(); // Customize the data array... return $array; }}
پیکربندی شناسه مدل
به طور پیش فرض، Scout از کلید اصلی مدل به عنوان شناسه / کلید منحصر به فرد
مدل استفاده می کند که در فهرست جستجو ذخیره می شود.
اگر میخواهید این رفتار را سفارشی کنید، میتوانید روشها
getScoutKey
و
getScoutKeyName
روشهای موجود در مدل را لغو کنید:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model;use Laravel\Scout\Searchable; class User extends Model{ use Searchable; /** * Get the value used to index the model. * * @return mixed */ public function getScoutKey() { return $this->email; } /** * Get the key name used to index the model. * * @return mixed */ public function getScoutKeyName() { return 'email'; }}
شناسایی کاربران
Scout همچنین به شما امکان می دهد هنگام استفاده از
Algolia
کاربران را به طور خودکار شناسایی کنید .
مرتبط کردن کاربر احراز هویت شده با عملیات جستجو ممکن است هنگام مشاهده
تجزیه و تحلیل جستجوی شما در داشبورد Algolia مفید باشد.
می توانید با تعریف
SCOUT_IDENTIFY
متغیر محیطی مانند فایل
true
برنامه خود، شناسایی کاربر را فعال کنید
.env
:
SCOUT_IDENTIFY=true
با فعال کردن این ویژگی، آدرس IP درخواست و شناسه اصلی کاربر تأیید شده شما را نیز به Algolia منتقل میکند، بنابراین این دادهها با هر درخواست جستجویی که توسط کاربر انجام میشود مرتبط میشود.
توسعه محلی
در حالی که شما آزاد هستید که از موتورهای جستجوی Algolia یا MeiliSearch در طول توسعه محلی استفاده کنید، ممکن است کار با موتور "مجموعه" راحت تر باشد. موتور جمعآوری از جملههای "where" و فیلتر مجموعه بر روی نتایج پایگاه داده موجود شما برای تعیین نتایج جستجوی قابل اجرا برای درخواست شما استفاده میکند. هنگام استفاده از این موتور، لازم نیست مدل های قابل جستجوی خود را "نمایه" کنید، زیرا آنها به سادگی از پایگاه داده محلی شما بازیابی می شوند.
برای استفاده از موتور جمعآوری، میتوانید به سادگی مقدار
SCOUT_DRIVER
متغیر محیطی را بر روی تنظیم کنید
collection
، یا درایور را مستقیماً در
فایل پیکربندی
collection
برنامه خود مشخص کنید:
scout
SCOUT_DRIVER=collection
هنگامی که درایور مجموعه را به عنوان درایور ترجیحی خود مشخص کردید، میتوانید درخواستهای جستجو را بر اساس مدلهای خود اجرا کنید. نمایه سازی موتورهای جستجو، مانند نمایه سازی مورد نیاز برای ایجاد نمایه های Algolia یا MeiliSearch، هنگام استفاده از موتور مجموعه غیر ضروری است.
نمایه سازی
واردات دسته ای
اگر Scout را در پروژهای موجود نصب میکنید، ممکن است از قبل سوابق پایگاه
دادهای داشته باشید که باید به فهرستهای خود وارد کنید.
Scout
scout:import
دستور Artisan را ارائه می دهد که می توانید از آن برای وارد کردن تمام
رکوردهای موجود خود در فهرست های جستجوی خود استفاده کنید:
php artisan scout:import "App\Models\Post"
این
flush
دستور ممکن است برای حذف تمام رکوردهای یک مدل از فهرست های جستجوی شما
استفاده شود:
php artisan scout:flush "App\Models\Post"
اصلاح پرس و جو واردات
اگر میخواهید پرسوجویی را که برای بازیابی همه مدلهای شما برای وارد کردن
دستهای استفاده میشود، تغییر دهید، میتوانید روشی را
makeAllSearchableUsing
روی مدل خود تعریف کنید.
این یک مکان عالی برای اضافه کردن هرگونه بارگیری رابطه مشتاقانه ای است که
ممکن است قبل از وارد کردن مدل های شما لازم باشد:
/** * Modify the query used to retrieve models when making all of the models searchable. * * @param \Illuminate\Database\Eloquent\Builder $query * @return \Illuminate\Database\Eloquent\Builder */protected function makeAllSearchableUsing($query){ return $query->with('author');}
اضافه کردن رکوردها
هنگامی که ویژگی را به یک مدل اضافه کردید
Laravel\Scout\Searchable
، تنها کاری که باید انجام دهید این است
save
یا
create
یک نمونه مدل و به طور خودکار به فهرست جستجوی شما اضافه می شود.
اگر Scout را برای استفاده از صف ها
پیکربندی کرده اید،
این عملیات در پس زمینه توسط کارگر صف شما انجام می شود:
use App\Models\Order; $order = new Order; // ... $order->save();
افزودن سوابق از طریق پرس و جو
اگر میخواهید مجموعهای از مدلها را از طریق یک جستار Eloquent به فهرست
جستجوی خود اضافه کنید، میتوانید این
searchable
روش را به پرس و جوی Eloquent زنجیره بزنید.
این
searchable
روش
نتایج
پرس و جو را تکه تکه می کند و رکوردها را به فهرست جستجوی شما اضافه می
کند.
مجدداً، اگر Scout را برای استفاده از صف ها پیکربندی کرده اید، همه تکه ها
توسط کارگران صف شما در پس زمینه وارد می شوند:
use App\Models\Order; Order::where('price', '>', 100)->searchable();
همچنین میتوانید
searchable
روش را در یک نمونه رابطه Eloquent فراخوانی کنید:
$user->orders()->searchable();
یا اگر مجموعهای از مدلهای Eloquent را در حافظه دارید، میتوانید متد را
searchable
در نمونه مجموعه فراخوانی کنید تا نمونههای مدل را به فهرست مربوطه خود
اضافه کنید:
$orders->searchable();
این
searchable
روش را می توان یک عملیات "بالا" در نظر گرفت. به عبارت دیگر، اگر رکورد مدل از قبل در فهرست شما باشد، به روز می شود. اگر در فهرست جستجو وجود نداشته باشد، به فهرست اضافه می شود.
به روز رسانی سوابق
برای به روز رسانی یک مدل قابل جستجو، فقط باید ویژگی های نمونه مدل و
save
مدل را در پایگاه داده خود به روز کنید.
Scout به طور خودکار تغییرات فهرست جستجوی شما را ادامه می دهد:
use App\Models\Order; $order = Order::find(1); // Update the order... $order->save();
همچنین میتوانید
searchable
متد را در یک نمونه پرس و جوی Eloquent برای بهروزرسانی مجموعهای از
مدلها فراخوانی کنید.
اگر مدلها در فهرست جستجوی شما وجود نداشته باشند، ایجاد میشوند:
Order::where('price', '>', 100)->searchable();
اگر میخواهید رکوردهای فهرست جستجو را برای همه مدلهای موجود در یک رابطه
بهروزرسانی کنید، میتوانید
searchable
از نمونه رابطه استفاده کنید:
$user->orders()->searchable();
یا اگر مجموعهای از مدلهای Eloquent را در حافظه دارید، میتوانید متد
موجود
searchable
در نمونه مجموعه را برای بهروزرسانی نمونههای مدل در فهرست مربوطه خود
فراخوانی کنید:
$orders->searchable();
حذف رکوردها
برای حذف یک رکورد از فهرست خود، می توانید به سادگی
delete
مدل را از پایگاه داده تهیه کنید.
این ممکن است حتی اگر از مدلهای حذف شده نرم
استفاده میکنید انجام شود
:
use App\Models\Order; $order = Order::find(1); $order->delete();
اگر نمیخواهید مدل را قبل از حذف رکورد بازیابی کنید، میتوانید از این
unsearchable
روش در یک نمونه پرس و جو Eloquent استفاده کنید:
Order::where('price', '>', 100)->unsearchable();
اگر میخواهید رکوردهای فهرست جستجو را برای همه مدلهای موجود در یک رابطه
حذف کنید، میتوانید از
unsearchable
مثال روی رابطه استفاده کنید:
$user->orders()->unsearchable();
یا اگر مجموعهای از مدلهای Eloquent را در حافظه دارید، میتوانید متد را
unsearchable
در نمونه مجموعه فراخوانی کنید تا نمونههای مدل را از فهرست مربوطه حذف
کنید:
$orders->unsearchable();
توقف نمایه سازی
گاهی اوقات ممکن است لازم باشد دسته ای از عملیات Eloquent را روی یک مدل
بدون همگام سازی داده های مدل با فهرست جستجوی خود انجام دهید.
شما می توانید این کار را با استفاده از
withoutSyncingToSearch
روش انجام دهید.
این روش یک بسته شدن را می پذیرد که بلافاصله اجرا می شود.
هر گونه عملیات مدلی که در بسته شدن رخ می دهد با شاخص مدل همگام سازی نمی
شود:
use App\Models\Order; Order::withoutSyncingToSearch(function () { // Perform model actions...});
نمونههای مدل قابل جستجوی مشروط
گاهی اوقات ممکن است نیاز داشته باشید که فقط یک مدل را تحت شرایط خاصی قابل
جستجو کنید.
برای مثال، تصور کنید مدلی دارید
App\Models\Post
که ممکن است در یکی از دو حالت باشد: «پیشنویس» و «منتشر شده».
ممکن است بخواهید فقط به پست های «منتشر شده» اجازه جستجو داشته باشید.
برای انجام این کار، ممکن است
shouldBeSearchable
روشی را در مدل خود تعریف کنید:
/** * Determine if the model should be searchable. * * @return bool */public function shouldBeSearchable(){ return $this->isPublished();}
این
shouldBeSearchable
روش تنها زمانی اعمال می شود که مدل ها را از طریق
save
و
create
متدها، پرس و جوها یا روابط دستکاری کنید.
ایجاد مستقیم مدلها یا مجموعههایی که با استفاده از
searchable
روش قابل جستجو هستند، نتیجه
shouldBeSearchable
روش را لغو میکند.
جستجوکردن
می توانید با استفاده از این
search
روش جستجوی یک مدل را آغاز کنید.
روش جستجو یک رشته واحد را می پذیرد که برای جستجوی مدل های شما استفاده می
شود.
سپس باید
get
متد را به پرس و جوی جستجو زنجیر کنید تا مدل های Eloquent را که با عبارت
جستجوی داده شده مطابقت دارند بازیابی کنید:
use App\Models\Order; $orders = Order::search('Star Trek')->get();
از آنجایی که جستجوهای Scout مجموعهای از مدلهای Eloquent را برمیگردانند، حتی ممکن است نتایج را مستقیماً از یک مسیر یا کنترلکننده برگردانید و بهطور خودکار به JSON تبدیل میشوند:
use App\Models\Order;use Illuminate\Http\Request; Route::get('/search', function (Request $request) { return Order::search($request->search)->get();});
اگر میخواهید نتایج جستجوی خام را قبل از تبدیل به مدلهای Eloquent دریافت
کنید، میتوانید از
raw
روش زیر استفاده کنید:
$orders = Order::search('Star Trek')->raw();
شاخص های سفارشی
پرس و جوهای جستجو معمولاً بر روی شاخص مشخص شده توسط روش مدل انجام می شود
searchableAs
.
با این حال، می توانید از این
within
روش برای تعیین یک شاخص سفارشی استفاده کنید که به جای آن باید جستجو شود:
$orders = Order::search('Star Trek') ->within('tv_shows_popularity_desc') ->get();
که در آن بندها
Scout به شما این امکان را می دهد که بندهای ساده "where" را به عبارت های جستجوی خود اضافه کنید. در حال حاضر، این بندها فقط از بررسیهای برابری عددی اولیه پشتیبانی میکنند و در درجه اول برای جستجوی محدوده جستجو توسط شناسه مالک مفید هستند:
use App\Models\Order; $orders = Order::search('Star Trek')->where('user_id', 1)->get();
می توانید از این
whereIn
روش برای محدود کردن نتایج در برابر مجموعه ای از مقادیر استفاده کنید:
$orders = Order::search('Star Trek')->whereIn( 'status', ['paid', 'open'])->get();
از آنجایی که یک فهرست جستجو یک پایگاه داده رابطهای نیست، جملات پیشرفتهتر «where» در حال حاضر پشتیبانی نمیشوند.
صفحه بندی
علاوه بر بازیابی مجموعه ای از مدل ها، می توانید نتایج جستجوی خود را با
استفاده از این
paginate
روش صفحه بندی کنید.
این متد یک نمونه را برمی گرداند
Illuminate\Pagination\LengthAwarePaginator
درست مثل اینکه
یک پرس و جو سنتی Eloquent را صفحه بندی
کرده باشید :
use App\Models\Order; $orders = Order::search('Star Trek')->paginate();
می توانید با ارسال مقدار به عنوان اولین آرگومان به
paginate
متد، تعداد مدل های بازیابی در هر صفحه را مشخص کنید:
$orders = Order::search('Star Trek')->paginate(15);
هنگامی که نتایج را بازیابی کردید، می توانید نتایج را نمایش دهید و پیوندهای صفحه را با استفاده از Blade ارائه دهید ، درست مثل اینکه یک پرس و جو سنتی Eloquent را صفحه بندی کرده اید:
<div class="container"> @foreach ($orders as $order) {{ $order->price }} @endforeach</div> {{ $orders->links() }}
البته، اگر میخواهید نتایج صفحهبندی را بهصورت JSON بازیابی کنید، میتوانید نمونه صفحهبندی را مستقیماً از یک مسیر یا کنترلر برگردانید:
use App\Models\Order;use Illuminate\Http\Request; Route::get('/orders', function (Request $request) { return Order::search($request->input('query'))->paginate(15);});
حذف نرم
اگر مدلهای نمایهشده شما در
حال حذف نرمافزاری
هستند و باید مدلهای حذف شده نرمافزاری خود را جستجو کنید،
soft_delete
گزینه
config/scout.php
فایل پیکربندی را روی
true
:
'soft_delete' => true,
وقتی این گزینه پیکربندی است
true
، Scout مدل های نرم حذف شده را از فهرست جستجو حذف نمی کند.
__soft_deleted
در عوض، یک ویژگی پنهان در رکورد ایندکس شده
تنظیم می کند .
سپس، میتوانید از روشهای
withTrashed
یا
onlyTrashed
برای بازیابی سوابق پاکشده نرم هنگام جستجو استفاده کنید:
use App\Models\Order; // Include trashed records when retrieving results...$orders = Order::search('Star Trek')->withTrashed()->get(); // Only include trashed records when retrieving results...$orders = Order::search('Star Trek')->onlyTrashed()->get();
هنگامی که یک مدل نرم افزاری حذف شده برای همیشه با استفاده از حذف شود
forceDelete
، Scout آن را به طور خودکار از فهرست جستجو حذف می کند.
سفارشی کردن جستجوهای موتور
اگر نیاز به سفارشیسازی پیشرفته رفتار جستجوی یک موتور دارید، ممکن است
بسته شدن را به عنوان آرگومان دوم برای
search
روش ارسال کنید.
برای مثال، میتوانید از این تماس برای اضافه کردن دادههای موقعیت
جغرافیایی به گزینههای جستجوی خود قبل از ارسال عبارت جستجو به Algolia استفاده کنید:
use Algolia\AlgoliaSearch\SearchIndex;use App\Models\Order; Order::search( 'Star Trek', function (SearchIndex $algolia, string $query, array $options) { $options['body']['query']['bool']['filter']['geo_distance'] = [ 'distance' => '1000km', 'location' => ['lat' => 36, 'lon' => 111], ]; return $algolia->search($query, $options); })->get();
موتورهای سفارشی
نوشتن موتور
اگر یکی از موتورهای جستجوی داخلی Scout با نیازهای شما مطابقت ندارد، می
توانید موتور سفارشی خود را بنویسید و آن را در Scout ثبت کنید.
موتور شما باید
Laravel\Scout\Engines\Engine
کلاس انتزاعی را گسترش دهد.
این کلاس انتزاعی شامل هشت روش است که موتور سفارشی شما باید اجرا کند:
use Laravel\Scout\Builder; abstract public function update($models);abstract public function delete($models);abstract public function search(Builder $builder);abstract public function paginate(Builder $builder, $perPage, $page);abstract public function mapIds($results);abstract public function map(Builder $builder, $results, $model);abstract public function getTotalCount($results);abstract public function flush($model);
ممکن است بررسی پیاده سازی این متدها در
Laravel\Scout\Engines\AlgoliaEngine
کلاس مفید باشد.
این کلاس نقطه شروع خوبی را برای یادگیری نحوه پیاده سازی هر یک از این روش
ها در موتور خود به شما ارائه می دهد.
ثبت موتور
هنگامی که موتور سفارشی خود را نوشتید، می توانید آن را با استفاده از
extend
روش مدیر موتور پیشاهنگ در Scout ثبت کنید.
مدیر موتور Scout ممکن است از ظرف سرویس لاراول حل شود.
شما باید
extend
متد را از
boot
متد کلاس خود
App\Providers\AppServiceProvider
یا هر ارائه دهنده سرویس دیگری که توسط برنامه شما استفاده می شود فراخوانی
کنید:
use App\ScoutExtensions\MySqlSearchEngineuse Laravel\Scout\EngineManager; /** * Bootstrap any application services. * * @return void */public function boot(){ resolve(EngineManager::class)->extend('mysql', function () { return new MySqlSearchEngine; });}
هنگامی که موتور شما ثبت شد، می توانید آن را به عنوان Scout پیش فرض خود در
فایل پیکربندی
driver
برنامه خود مشخص کنید:
config/scout.php
'driver' => 'mysql',
ماکروهای سازنده
اگر میخواهید یک متد سازنده جستجوی Scout سفارشی تعریف کنید، میتوانید از
این
macro
روش در
Laravel\Scout\Builder
کلاس استفاده کنید.
به طور معمول، "ماکروها" باید در روش ارائه دهنده خدمات
تعریف شوند
boot
:
use Illuminate\Support\Facades\Response;use Illuminate\Support\ServiceProvider;use Laravel\Scout\Builder; /** * Bootstrap any application services. * * @return void */public function boot(){ Builder::macro('count', function () { return $this->engine()->getTotalCount( $this->engine()->search($this) ); });}
تابع
macro
یک نام ماکرو را به عنوان اولین آرگومان خود و یک بسته را به عنوان آرگومان
دوم خود می پذیرد.
بسته شدن ماکرو هنگام فراخوانی نام ماکرو از یک
Laravel\Scout\Builder
پیاده سازی اجرا می شود:
use App\Models\Order; Order::search('Star Trek')->count();