3分鐘短文:Laravel鏈接全文搜索引擎,加快查詢速度

引言

對於數據庫查詢,主鍵和索引每每是加速搜索的利器。而對於文本搜索,模糊搜索,全文檢索,MySQL的MyISAM引擎雖然支持,可是性能每每不能達到生產的需求,或者說服務帶載能力太弱。php

咱們須要專門的文本搜索引擎,而且鏈接到laravel應用程序內,這就是本文所要說的Scout。laravel

代碼時間

laravel scout 是一個獨立的包和類庫,能夠很方便地經過composer接入系統,且與Eloquent Model模型關聯使用。git

官方scout內置了 AlgoliaElasticsearch 驅動,可是社區也提供了其餘可選項。若是默認的話,優先選用的確定是 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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索