引言
對於數據庫查詢,主鍵和索引每每是加速搜索的利器。而對於文本搜索,模糊搜索,全文檢索,MySQL的MyISAM引擎雖然支持,可是性能每每不能達到生產的需求,或者說服務帶載能力太弱。php
咱們須要專門的文本搜索引擎,而且鏈接到laravel應用程序內,這就是本文所要說的Scout。laravel
代碼時間
laravel scout 是一個獨立的包和類庫,能夠很方便地經過composer接入系統,且與Eloquent Model模型關聯使用。git
官方scout內置了 Algolia 和 Elasticsearch 驅動,可是社區也提供了其餘可選項。若是默認的話,優先選用的確定是 Algolia。程序員
laravel 5.3及以上版本爲系統引入scout庫:web
composer require laravel/scout
而後在 config/app.php 文件內的 providers 服務提供者內加入以下內容:數據庫
'providers' => [
Laravel\Scout\ScoutServiceProvider::class,
]
若是想要使用配置文件設置scout,那麼就把配置文件發佈出來:編程
php artisan vendor:publish
這會生成 config/scout.php 文件。咱們再引入 algolia 的sdk庫文件,以便在程序內使用:bash
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 :-)
我是@程序員小助手,持續分享編程知識,歡迎關注。
本文分享自微信公衆號 - 程序員小助手(mql45ea)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。