Scout Trong Laravel Là Gì?

Scout Trong Laravel Là Gì?
Scout trong Laravel thường cung cấp giải pháp đơn giản vì dựa vào trình điều khiển và tìm thêm full text vào trong các mô hình eloquent.

Scout trong Laravel có thể cung cấp giải pháp thông minh dựa trên driver đơn giản và bổ sung chức năng tìm kiếm full-text vào các model của Eloquent. Khi sử dụng model observer, scout sẽ tự giữ các index tìm kiếm và đồng bộ với các bản ghi trong Eloquent. Vậy Laravel scout là gì? 

 

Giới thiệu Scout trong Laravel 

 

Scout trong Laravel là giải pháp để tìm kiếm full-text cho Eloquent trong các model của chúng ta. Khi bạn sử dụng model để quan sát, scout sẽ giữ các chỉ mục tìm kiếm từ bạn và tự nó đồng bộ với các bản ghi trong Eloquent. 

 

Hiện tại, Scout thường có khuynh hướng đi đôi với Algolia driver. Tuy nhiên, thiết lập các driver đơn giản và mở rộng scout cũng dễ dàng hơn (bằng cách thực hiện công việc tìm kiếm của chính bạn).

 

Scout trong Laravel được ví như một thư viện quản lý trong chuyện xử lý của index bất kỳ lúc nào mà có sự thay đổi dữ liệu của model. Nơi mà dữ liệu được tạo index sẽ phụ thuộc vào driver mà các bạn đã cấu hình với thư viện scout trước đó. Thư viện scout có hỗ trợ Algolia (API công cụ tìm kiếm từ cloud). 

 

Tiến hành cài đặt scout 

 

Đầu tiên, các bạn nên thông qua Composer. 

 

composer require laravel/scout

 

Sau đó, các bạn sẽ cài scout. Nên publish cài đặt scout bằng việc sử dụng vendor:publish (từ Artisan command). Dòng lệnh này sẽ tự đặt trong file scout.php ở thư mục config của bạn.

 

php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"

 

Tiếp theo, các bạn cần thêm Laravel\Scout\Searchable vào model mà bạn đang muốn. Việc thiết lập này sẽ giúp bạn có đăng ký model và đồng bộ với quá trình tìm kiếm về sau. 

 

 

Queueing là gì?

 

Dù chuyện sử dụng scout là khuyến khích, các bạn cũng nên kiểm tra cấu hình điều khiển queue (trước khi sử dụng thư viện). Khi làm việc với queue, nó sẽ cho phép scout xếp hàng đầy đủ các hoạt động đã được đồng bộ hóa thông tin mô hình và các chỉ mục tìm kiếm tương ứng. 

 

Từ đó, scout sẽ cung cấp thời gian phản hồi nhanh và chính xác hơn ở giao diện web của ứng dụng. Một khi bạn đã configured queue, thiết lập giá trị của queue trong config/scout.php sẽ là true.

 

'queue' => true,

 

Algolia driver là gì?

 

Khi các bạn chọn sử dụng Algolia driver, hãy configure id và các thông tin bảo mật của bạn nằm trong file configuration config/scout.php. Khi các thông tin đã được xác thực thành công và cấu hình đầy đủ, bạn cũng nên cài đặt Algolve PHP SDK thông qua composer như sau:

 

composer require algolia/algoliasearch-client-php

 

Configuration như thế nào? 

 

Configuring Model Indexes

 

Mỗi model, Eloquent sẽ đồng bộ với một chỉ mục tìm kiếm index khác nhau và nó sẽ chứa đầy đủ bản ghi có thể tìm kiếm ở một mô hình. Bạn có thể hiểu rằng mỗi index là một bảng MySQL. 

 

Thông thường mà nói, mỗi một model sẽ được duy trì đến khi nào index tìm được tên table phù hợp (trong model). Đây là hình thức số nhiều của tên model. Điểm khác biệt là chúng ta được tùy chỉnh index của mỗi model (overriding phương thức searchableAs trên model đó).

 

 

Configuring Searchable Data

 

Toàn bộ toArray của một model sẽ được tự động tìm kiếm theo index. Nếu muốn tùy chỉnh data (đã được đồng bộ hóa với chỉ mục tìm kiếm), bạn có thể override phương thức toSearchableArray trong model. 

 

toArray();
        // Customize array...
        return $array;
    }
}

 

Indexing là gì? 

 

Batch import

 

Nếu các bạn đã cài Scout vào một dự án đang tồn tại, thì bạn dùng bản ghi trong database (đang cần) để nhập thông tin vào trình tìm kiếm của bạn. Scout có cung cấp lệnh artisan thủ công để chúng ta sử dụng và nhập toàn bộ bản ghi hiện có vào chỉ mục tìm kiếm index. 

 

php artisan scout:import "App\Post"

 

Thêm các record

 

Khi đã có thêm Laravel \ Scout \ Searchable vào trong model, bạn nên lưu model đó và nó sẽ tự động nằm trong chỉ mục tìm kiếm của bạn. Nếu đã configured scout để sử dụng queue, hàng đợi của bạn sẽ được thực hiện ở chế độ background. 

 

$order = new App\Order;
// ...
$order->save();

 

Bổ sung Via Query 

 

Nếu muốn bổ sung collection của model vào chỉ mục tìm kiếm (thông qua query), thì bạn liên kết phương thức tìm kiếm vào trong eloquent query. Phương pháp này có thể tìm kiếm kết quả của truy vấn và thêm vào các bản ghi trong chỉ mục tìm kiếm. Nếu đã cấu hình scout để dùng queue, toàn bộ khối sẽ đi vào trong background. 

 

// Adding via Eloquent query...
App\Order::where('price', '>', 100)->searchable();
// You may also add records via relationships...
$user->orders()->searchable();
// You may also add records via collections...
$orders->searchable();

 

Phương thức searchable được xem là một hoạt động upsert. Nếu bản ghi mô hình đã nằm trong chỉ mục, thì nó sẽ được cập nhật thêm. Nếu không có trong chỉ mục tìm kiếm trước đó, thì nó sẽ đi vào trong chỉ mục. 

 

// Updating via Eloquent query...
App\Order::where('price', '>', 100)->searchable();
// You may also update via relationships...
$user->orders()->searchable();
// You may also update via collections...
$orders->searchable();

 

Xóa các bản ghi 

 

Để xóa bản ghi trong index, các bạn hãy xóa ở model từ database. Cách làm này cũng phù hợp với soft deleted models. 

 

$order = App\Order::find(1);
$order->delete();

 

Trong trường hợp muốn retrieve model (trước khi xóa bản ghi), bạn sử dụng phương thức unsearchable trong eloquent để thay thế cho collection.

 

// Removing via Eloquent query...
App\Order::where('price', '>', 100)->unsearchable();
// You may also remove via relationships...
$user->orders()->unsearchable();
// You may also remove via collections...
$orders->unsearchable();

 

Tạm ngưng index

 

Các bạn có thể thực hiện nhiều hoạt động eloquent operations trên model mà không phải đồng bộ hóa dữ liệu mô hình với chỉ mục tìm kiếm. Sử dụng thử phương pháp withoutSyncingToSearch. 

 

Phương thức này có thể chấp nhận một callback và thực thi nhanh chóng. Bất cứ hoạt động mô hình nào xảy ra trong cuộc gọi lại sẽ không thể đồng bộ hóa với chỉ số của mô hình. 

 

App\Order::withoutSyncingToSearch(function () {
    // Perform model actions...
});

 

Thực hiện công việc tìm kiếm 

 

Bắt đầu phiên tìm kiếm trong model bằng cách sử dụng phương thức search. Phương thức này chấp nhận chuỗi duy nhất được dùng để tìm kiếm mô hình riêng của bạn. Tiếp theo, bạn nối tiếp phương thức nhận vào truy vấn tìm kiếm để truy xuất các mô hình. Đó có thể là mô hình tham vọng và thích hợp với truy vấn tìm kiếm đã cho trước đó. 

 

$orders = App\Order::search('Star Trek')->get();

 

Các tìm kiếm scout thường trả về một collection của eloquent models, các bạn có thể trả lại kết quả trực tiếp từ route hoặc controller. Chúng sẽ tự chuyển qua JSON. 

 

use Illuminate\Http\Request;
Route::get('/search', function (Request $request) {
    return App\Order::search($request->search)->get();
});

 

Nếu muốn lấy một dữ liệu kết quả thuần trả về trước khi chuyển qua Eloquent model, bạn có thể dùng phương thức raw. 

 

$orders = App\Order::search('Star Trek')->raw();

 

Các truy vấn tìm kiếm thường sẽ ở trên chỉ mục được xác định từ phương pháp có thể tìm kiếm của model. Tuy nhiên, các bạn cũng có thể dùng phương thức bên trong để chỉ định một chỉ mục tùy chỉnh để thay thế.

 

$orders = App\Order::search('Star Trek')
    ->within('tv_shows_popularity_desc')
    ->get();

 

Where clauses

 

Scout cho phép chúng ta bổ sung các mệnh đề where đơn giản vào trong truy vấn tìm kiếm. Các khoản này chỉ có thể hỗ trợ kiểm tra bình đẳng số cơ bản và nó mang lại lợi ích tìm kiếm các truy vấn theo ID. Do một chỉ mục tìm kiếm không phải là cơ sở dữ liệu quan hệ, các mệnh đề hiện hữu của where sẽ không được hỗ trợ.

 

$orders = App\Order::search('Star Trek')->where('user_id', 1)->get();

 

Pagination

 

Ngoài lấy ra ngoài collection của các model, chúng ta có thể phân trang rõ ràng của các kết quả tìm kiếm. Hãy sử dụng phương pháp paginate. Nó sẽ hỗ trợ các bạn trả về một trường hợp paginator tương tự như bạn đã paginated một truy vấn thông thường của eloquent.

 

$orders = App\Order::search('Star Trek')->paginate();

 

Hơn nữa, các bạn có thể chỉ định số lượng các mô hình rõ ràng để lấy ra ở mỗi trang. Chúng ta thay đổi số đầu tiên cho phương thức phân trang. 

 

$orders = App\Order::search('Star Trek')->paginate(15);

Custom engines là gì?

 

Một trong các công cụ tìm kiếm scout không phù hợp với nhu cầu hiện tại của bạn, các bạn có thể tạo công cụ tùy chỉnh của riêng mình và đừng quên đăng ký với scout. Bạn nên mở rộng lớp trừu tượng Laravel \ Scout \ Engines \ Engine. Lớp abstract thường có 7 phương pháp mà công cụ tùy chỉnh phải thực hiện. 

 

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($results, $model);
abstract public function getTotalCount($results);

 

Khi cân nhắc đến chuyện triển khai các method đó trên lớp Laravel \ Scout \ Engines \ AlgoliaEngine, các bạn sẽ thấy chúng hữu ích đến mức nào. Class sẽ cung cấp điểm khởi đầu thuận lợi để nó thực hiện các phương pháp trong công cụ của riêng các bạn. 

 

Khởi động các engine 

 

Khi bạn đã sở hữu động cơ tùy chỉnh trong tay, hãy đăng ký với scout bằng phương pháp mở rộng từ trình quản lý công cụ scout. Đừng quên gọi phương thức extend từ phương pháp khởi động của AppServiceProvider hoặc một nhà cung cấp dịch vụ khác (miễn sao ứng dụng đó có thể hoạt động tốt). Lấy ví dụ bạn đã từng tạo một MySqlSearchEngine, thì bạn đăng ký nó như thế này:

 

use Laravel\Scout\EngineManager;
/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    resolve(EngineManager::class)->extend('mysql', function () {
        return new MySqlSearchEngine;
    });
}

 

Một khi động cơ của bạn đã được đăng ký và thiết lập, bạn chỉ định nó trở thành trình điều khiển scout mặc định trong tập tin cấu hình config/ scout.php

 

'driver' => 'mysql',

 

 

 

 

 

Hồ Hữu Hiền

Mình là developer nên đôi khi viết bài không hay lắm mong các bạn thông cảm. Nếu muốn biết thêm thông tin về mình thì vui lòng vào website này để biết. https://huuhienqt.dev/

Bình luận (0)