+19

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. 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.
Screen Shot 2021-09-12 at 20.53.49.png

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: Screen Shot 2021-09-12 at 21.05.57.png

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="Laravel\Scout\ScoutServiceProvider"

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=Matchish\ScoutElasticSearch\Engines\ElasticSearchEngine ELASTICSEARCH_HOST=localhost:9200
  • Đăng kí provider trong config/app.php:
'providers' => [
    // Other Service Providers
   \Matchish\ScoutElasticSearch\ElasticSearchServiceProvider::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:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;

class EmployeeProfile extends Model
{
    use Searchable;
}

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 "App\Models\EmployeeProfile"
  • Mở index management trong Kibana, ta sẽ thấy các index mới được import vào:
    Screen Shot 2021-09-12 at 21.32.07.png
  • 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


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí