Tìm kiếm với Elasticsearch trong Laravel

1. Giới thiệu về Elasticsearch ElasticSearch là 1 search engine sử dụng như 1 server và khi ta muốn thêm, sửa, xóa dữ liệu thì ta sẽ dùng curl để connect đến server ElasticSearch thông qua cổng 9200. Elasticsearch là một document oriented database, nhiệm vụ của nó là lưu trữ và triệu gọi document.

1. Giới thiệu về Elasticsearch

ElasticSearch là 1 search engine sử dụng như 1 server và khi ta muốn thêm, sửa, xóa dữ liệu thì ta sẽ dùng curl để connect đến server ElasticSearch thông qua cổng 9200.
Elasticsearch là một document oriented database, nhiệm vụ của nó là lưu trữ và triệu gọi document. Tất cả các documents được hiển thị dưới dụng Json. Elasticsearch cho phép phân tích và tìm kiếm dữ liệu theo thời gian thực, nó có performance rất tốt, dễ dàng áp dụng và triển khai một cách hiệu quả vào các nguồn dữ liệu khác nhau.

2. Cài đặt Elasticsearch

Tham khảo cách cài đặt tại đây.
Với Macos, cách dễ dàng nhất là cài đặt thông qua homebrew.

  • Để cài homebrew, chạy command sau:
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"<br>
  • Để cài Elasticsearch:
$ brew tap elastic/tap
$ brew install elastic/tap/elasticsearch-full
  • Sau khi cài xong, chạy lệnh sau để start Elasticsearch:
$ elasticsearch<br>
  • Elasticsearch sẽ chạy ở cổng 9200, kiểm tra trên browser:

3. Cài đặt Kibana

Kibana là một nền tảng phân tích hiển thị dữ liệu từ Elasticsearch một cách trực quan dễ sử dụng, Kibana cũng là một công cụ mã nguồn mở miễn phí, cho tất cả mọi người sử dụng. Kibana cung cấp các tính năng cho người dùng quản lý như biểu đồ cột, biểu đồ đường, biểu đồ tròn, biểu đồ nhiệt và nhiều loại chart khác nữa.

  • Để cài Kibana, tham khảo tại đây.
    Mình sẽ minh họa cách cài đặt trên macos, thông qua homebrew:
$ brew tap elastic/tap
$ brew install elastic/tap/kibana-full
  • Sau đó, tích hợp Elasticsearch với Kibana bằng cách sửa file cấu hình kibana.yml:
$ cd /usr/local/etc/kibana
$ nano kibana.yml

Ta chỉ việc uncomment dòng sau: elasticsearch.hosts:[“http://localhost:9200“]

  • Để start Kibana, ta chỉ việc chạy command sau:
    $ kibana
  • Kibana sẽ chạy ở cổng 5601, kiểm tra trên trình duyệt:

4. Cài đặt Laravel Scout

Tham khảo Laravel Scout trên docs của Laravel tại đây.
Laravel Scout là full-text search dựa trên driver dành cho Eloquent. Ngoài ra, nó còn hỗ trợ Algolia, Elastic Search, và vì nó là full-text search dựa trên driver nên bất cứ ai cũng có thể tạo sự tích hợp của riêng mình với các hệ thông full-text search khác.

  • Cài đặt Laravel Scout package:
composer require laravel/scout<br>
  • Sau khi cài thành công Scout, dùng command line để publish config Scout:
php artisan vendor:publish --provider="LaravelScoutScoutServiceProvider"

5. Cài đặt Elasticsearch Driver

Ở đây, mình sẽ sử dụng matchish/laravel-scout-elasticsearch. Tham khảo tại đây.

  • Cài đặt:
composer require matchish/laravel-scout-elasticsearch
  • Trong file .env:
    SCOUT_DRIVER=MatchishScoutElasticSearchEnginesElasticSearchEngine
    ELASTICSEARCH_HOST=localhost:9200
  • Đăng kí provider trong config/app.php:
'providers' => [
    // Other Service Providers
   MatchishScoutElasticSearchElasticSearchServiceProvider::class
],
  • Publich config sử dụng câu lệnh:
php artisan vendor:publish --tag config

6. Cấu hình Model Indexes

Sau khi tạo model, migration, mỗi model sẽ được đồng bộ với một search index. Mỗi index sẽ chứa tất cả các records có thể được search trong Model đó. Ta có thể hiểu mỗi index giống như 1 SQL table:

<?phpnamespaceAppModels;useIlluminateDatabaseEloquentModel;useLaravelScoutSearchable;classEmployeeProfileextendsModel{useSearchable;}

7. Import index

  • Nếu muốn import các records đã có trong models, ta sử dụng câu lệnh sau:
php artisan scout:import "AppModelsEmployeeProfile"
  • Mở index management trong Kibana, ta sẽ thấy các index mới được import vào:
  • Mỗi record trong SQL sẽ tương ứng với 1 document trong index.

8. Searching

  • Sử dụng phương thức search():
$profiles = Employeeprofile::search('fpt')->get();
  • Kết hợp sử dụng where:
$orders = Order::search('Starrek')->where('user_id', 1)->get();
  • Kết hợp phân trang:
$orders = Order::search('Starrek')->paginate(10);

9. Tài liệu tham khảo

https://viblo.asia/p/su-dung-elasticsearch-trong-laravel-3Q75wDxBKWb
https://www.elastic.co/guide/index.html
https://laravel.com/docs/8.x/scout

Nguồn: viblo.asia

Bài viết liên quan

WebP là gì? Hướng dẫn cách để chuyển hình ảnh jpg, png qua webp

WebP là gì? WebP là một định dạng ảnh hiện đại, được phát triển bởi Google

Điểm khác biệt giữa IPv4 và IPv6 là gì?

IPv4 và IPv6 là hai phiên bản của hệ thống địa chỉ Giao thức Internet (IP). IP l

Check nameservers của tên miền xem website trỏ đúng chưa

Tìm hiểu cách check nameservers của tên miền để xác định tên miền đó đang dùn

Mình đang dùng Google Domains để check tên miền hàng ngày

Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ