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

  1. Cài đặt Scout:
composer require laravel/scout
php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
  1. 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.

Bình luận