引言
對於資料庫查詢,主鍵和索引往往是加速搜尋的利器。而對於文字搜尋, 模糊搜尋,全文檢索,MySQL的MyISAM引擎雖然支援,但是效能往往不能達到生產的需求, 或者說服務帶載能力太弱。
我們需要專門的文字搜尋引擎,並且連線到laravel應用程式內,這就是本文所要說的Scout。
程式碼時間laravel scout 是一個獨立的包和類庫,可以很方便地通過composer接入系統, 且與Eloquent Model模型關聯使用。
官方scout內建了 Algolia 和 Elasticsearch 驅動,但是社群也提供了其他可選項。 如果預設的話,優先選用的肯定是 Algolia。
laravel 5.3及以上版本為系統引入scout庫:
composer require laravel/scout
然後在 config/app.php 檔案內的 providers 服務提供者內加入如下內容:
'providers' => [ Laravel\\Scout\\ScoutServiceProvider::class,]
如果想要使用配置檔案設定scout,那麼就把配置檔案釋出出來:
php artisan vendor:publish
這會生成 config/scout.php 檔案。我們再引入 algolia 的sdk庫檔案,以便在程式內使用:
composer require algolia/algoliasearch-client-php
想要在模型內引入搜尋服務,只需在模型檔案內引入
use Laravel\\Scout\\Searchable;
在模型內手動實現,那些屬性和欄位可以被搜尋,只需實現 toSearchableArray() 方法。 然後實現 searchableAs(),返回一個字串,用於指定索引的模型名。
scout預設訂閱了模型的 create/delete/update 時間,這些寫操作的資料會觸發更新索引, 刪除索引,建立索引。方式可以是同步,也可以放到佇列內非同步處理。
通過索引進行搜尋,scout在查詢方式上幾乎與eloquent model的方式別無二致。比如:
Review::search('Lious')->get();
或者鏈式呼叫分頁:
Review::search('Lious')->paginate(20);
由於 search 方法返回的是Query Builder物件,可以鏈式呼叫查詢條件,和集合的方法。 比如對查詢結果集進行過濾:
Review::search('Lious')->where('account_id', 2)->get();
你在模型內使用的方法,這裡都適用。
對於某些資料有可能並不想建立索引,放入搜尋引擎,那麼只需在模型內顯式宣告如下:
Review::withoutSyncingToSearch(function () { factory(Review::class, 10)->create();});
批量建立10條資料,且不建立索引。
手動控制某些輸入放入搜尋引擎,建立索引資料,則可以鏈式呼叫 searchable() 方法:
Review::all()->searchable();
或者通過關聯關係,將關聯模型的資料寫入搜尋引擎:
$user->reviews()->searchable();
某些搜尋資料不進行索引:
Review::where('actived', false)->unsearchable();
無效的條目不加入索引,節省空間。
假如你的資料庫已經生產了大量的資料,或者在測試階段,想要手動把所有的定義資料 匯入到搜尋引擎,可以在命令列如此操作:
php artisan scout:import App\\\\Review
寫在最後
本文通過介紹laravel scout索引類的方法,向大家展示了如何引入搜尋引擎, 以及在程式內精細化控制索引資料的方法。全文檢索在現代的web應用中應對高併發的 場景很有一套,值得大家深入研究學習。
Happy coding :-)