首頁>技術>

引言

對於資料庫查詢,主鍵和索引往往是加速搜尋的利器。而對於文字搜尋, 模糊搜尋,全文檢索,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 :-)

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 工作中常用的抓包工具-Fiddler和Wireshark介紹