Giới thiệu về laravel scout trong laravel 5.3

Là một trong số những tính năng mới được giới thiệu trong laravel 5.3 - phiên bản mới nhất của framework hết sức thông dụng này, Laravel Scout hỗ trợ giải pháp tìm kiếm full textsearch, giúp ta dễ dàng đánh index và tìm kiếm trong nội dung của Eloquent Model. Laravel Scout hiện tương thích với 2 service rất phổ biến là Algolia và ElasticSearch , và có thể sẽ được mở rộng ra hơn nữa trong tương lai.

Cài đặt Scout

Là một package độc lập của laravel, để sử dụng Scout, trước hết ta cần khai báo package này trong composer để kéo về

composer require laravel/scout

Tương tự như với các service khác, trước khi sử dụng Scout trong ứng dụng của mình, ta cần khai báo service provider của nó . Chỉ cần thêm vào trong file config/app.php

'providers' => [
// other services
Laravel\Scout\ScoutServiceProvider::class,
]

Việc tiếp theo, tùy theo việc bạn muốn sử dụng service search nào. Như đã nói ở trên, hiện Scout tương thích với AlgoliaElasticSearch, trong trường hợp này, ta hãy dùng Algolia làm ví dụ. Tất nhiên, nếu đã muốn dùng, ta cần kéo thêm cả SDK của service đó về nữa.

composer require algolia/algoliasearch-client-php

Bước cuối cùng, ta cần thiết lập thông tin credentials của ta với Algolia cho Scout. Trước tiên hãy chạy

php artisan vendor:publish

sau đó điền thông tin credentials đó vào trong file config/scout.php . Việc cài đặt cho Scout đến đây là hoàn thành

Đánh đấu Index cho Model

Việc sử dụng Scout thật sự là hết sức đơn giản. Chỉ cần trong class model, ta khai báo thêm sử dụng trait Searchable

use Laravel\Scout\Searchable ;

Sau đó, nếu cảm thấy cần, ta có thể khai báo cụ thể hơn, những thuộc tính nào sẽ được index bằng method toSearchableArray(), hoặc khai báo tên cụ thể cho những index sẽ của model bằng method searchableAs() .

Xong xuôi tất cả, ta có thể kiểm tra lại bằng cách vào trang index của mình trên Algolia. Khi ta insert, delete hay update dữ liệu của mình, ta có thể thấy data của ta đã được cập nhập.

Queues

Đến đây, hẳn ta đã có thể thấy, để làm được như vậy, dữ liệu trong database của ta, và trên Algolia hẳn phải được đồng bộ. Và dĩ nhiên, ta sẽ phải tạo HTTP request để gửi tới Algolia mỗi khi có thay đổi nào trong database, và nếu cứ để như vậy, hẳn sẽ khiến thực thi của ta chậm đi vô cùng nhiều. Giải pháp đơn giản nhất được nghĩ tới ngay, đó là ta sẽ queue những HTTP request này, để database local được update một cách ngay lập tức, còn dữ liệu trên Algolia sẽ được đồng bộ từ từ, sao cho ít ảnh hưởng nhất tới performance. Và để làm được điều này cũng không cần gì nhiều, đơn giản chỉ cần vào trong file config/scout.php và set lại cho queue nhận giá trì true.

Tìm kiếm với Scout

Cú pháp của Scout rất đơn giản. Giả sử ta có model Review, lưu lại đánh giá của người dùng. Cú pháp tìm kiếm với Scout trong trường hợp này khá đơn giản

<?php

namespace App\Entities;

use Laravel\Scout\Searchable;

class Review
{
    use Searchable;

    // Get all records from the Review that match the term "Llew"
    Review::search('Llew')->get();

    // Get all records from the Review that match the term "Llew",
    // limited to 20 per page and reading the ?page query parameter,
    // just like Eloquent pagination
    Review::search('Llew')->paginate(20);

    // Get all records from the Review that match the term "Llew"
    // and have an account_id field set to 2
    Review::search('Llew')->where('account_id', 2)->get();
}

Kết quả trả về của method search() là một collection các Eloquents Model thỏa mãn điều kiện tìm kiếm của ta.

Các trường hợp đặc biệt

Cùng điểm qua một vài trường hợp đặc biệt

Bỏ qua indexing

Đôi khi ta muốn thực hiện việc thay đổi dữ liệu, nhưng không muốn trigger sự thay đổi về index ( như khi ta thêm dữ liệu tạm thời, sau đó sẽ xóa ngay , hay khi thực hiện việc test thêm dữ liệu ). Trong trường hợp đó, chỉ cần đặt đoạn code của ta trong method withoutSyncingToSearch() là đủ.

Review::withoutSyncingToSearch(function () {
    // make a bunch of reviews, e.g.
    factory(Review::class, 10)->create();
});

Manually trigger indexing

Đôi khi ta muốn tự thực hiện việc gọi đánh index cho một khối dữ liệu nhất định, việc đó hoàn toàn có thể thực hiện dễ dàng với Scout. Chỉ cần thêm method searchable() vào cuối một chuỗi truy vấn Eloquent , sẽ tự động gọi việc thực hiện đánh index đối với kết quả của chuỗi truy vấn đó . Ví dụ

Review::all()->searchable();

tương tự ,ta cũng có thể thực hiện việc bỏ đánh index, với method unsearchable()

Review::where('sucky', true)->unsearchable();

Trên đây là bài giới thiệu sơ lược về Laravel Scout, một service mới được giới thiệu trong phiên bản laravel 5.3, dịch từ bài viết Introducing Laravel Scout.