Tìm Kiếm Siêu Tốc Với Laravel Scout và Meilisearch
·
2 min read
User::where('name', 'like', '%john%')->get() ổn cho 100 người dùng.
Với 100,000 người dùng, nó chậm.
Và nếu người dùng gõ "Jonh", nó không trả về gì cả.
Laravel Scout cung cấp giải pháp dựa trên driver để thêm tìm kiếm full-text vào các models của bạn. Meilisearch là search engine mã nguồn mở, cực nhanh, kết hợp hoàn hảo với Laravel.
Cài Đặt
- Cài đặt Scout:
composer require laravel/scout
php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
- Cài đặt Meilisearch Driver:
composer require meilisearch/meilisearch-php http-interop/http-factory-guzzle
Cấu Hình
Thêm trait Searchable vào model của bạn.
use Laravel\Scout\Searchable;
class Post extends Model
{
use Searchable;
// Tùy chọn: Tùy chỉnh dữ liệu nào được index
public function toSearchableArray()
{
return [
'id' => $this->id,
'title' => $this->title,
'content' => strip_tags($this->content),
];
}
}
Chạy Meilisearch
Cách dễ nhất là qua Laravel Sail (Docker):
# docker-compose.yml
meilisearch:
image: 'getmeili/meilisearch:latest'
ports:
- '7700:7700'
Index Dữ Liệu
Đẩy dữ liệu hiện có của bạn tới search engine:
php artisan scout:import "App\Models\Post"
Tìm Kiếm
Bây giờ thay thế các truy vấn tiêu chuẩn của bạn bằng truy vấn Scout:
// SQL tiêu chuẩn (Chậm, nghiêm ngặt)
Post::where('title', 'like', '%larvel%')->get(); // Không trả về gì
// Scout (Nhanh, chịu lỗi đánh máy)
Post::search('larvel')->get(); // Trả về các posts 'Laravel'
Filters
Scout hỗ trợ các mệnh đề "where" đơn giản.
Post::search('tutorial')
->where('status', 'published')
->paginate(20);
Để lọc nâng cao (facets, sorting), Meilisearch cực kỳ mạnh mẽ và rẻ hơn nhiều so với Algolia.