ElasticSearch with PHP

trieu.dev.da

Nguyễn Thanh Triều

Mở đầu
Hôm nay mình sẽ viết về ElasticSearch, cách sử dụng ElasticSearch trong Laravel. Chắc hẳn là developer thì không lạ gì với keyword ElasticSearch rồi đúng không. Để tìm hiểu thêm về ElasticSearch thì có thể đọc thêm bài này trên Viblo. Một cách tổng quan ta có thể điểm lại một vài thông tin ngắn gọn về ElasticSearch như sau:
  • Elasticsearch là một search engine.
  • Elasticsearch được xây dựng để hoạt động như một server cloud theo cơ chế của RESTful.
  • Kế thừa và phát triển từ Lucene Apache.
  • Phát triển bằng ngôn ngữ java.
Như vậy ta có thể hiểu nôm na ElasticSearch là 1 engine hỗ trợ search 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. Về cấu trúc của ElasticSearch thì ta có thể hiểu như sau (so sánh với SQL):
Trong SQL ta có các cơ sở dữ liệu với các bảng chứa cấu trúc của dữ liệu (các cột) và các row dữ liệu. Chuyển cấu trúc đó so sánh với ElasticSearch thì ta có Indexes (giống các Database trong DBMS) và bên trong Indexes ta có Types (giống Table trong DBMS) và ta cũng có Documents giống như các bản ghi trong SQL. Trong Document chứa các field tương ứng với các thuộc tính của Document đó. Như vậy cũng đủ hiểu sơ qua về ElasticSearch rồi bây giờ chúng ta sẽ đi tìm hiểu chi tiết các cài đặt và ứng dụng vào với project Laravel.
Cài đặt
Cài đặt ElasticSearch trên Ubuntu
ElasticSearch thích hợp trên mọi môi trường Windows, Mac, Linux. Mình xin phép chỉ nêu cách cài đặt trên Ubuntu. Trên các hệ điều hành khác có thể xem tại đây. Để cài đặt trên Ubuntu trước hết ta cần cài đặt Java. Để cài đặt Java ta thực hiện các lệnh sau:
1678931310559.png

Sau khi cài đặt xong ta có thể check bằng cách dùng lệnh:
1678931318519.png

Nếu output như sau tức là bạn đã cài đặt java thành công:
1678931328433.png

Tiếp tục để cài ElasticSearch ta có thể tải file .DEB này về chạy là được luôn. Để kiểm tra đã cài đặt thành công ElasticSearch lên máy hay chưa ta truy cập thử localhost:9200 nếu ra kết quả như sau có nghĩa là bạn đã cài đặt thành công:



Sử dụng ElasticSearch for PHP
ElasticSearch cung cấp sẵn thư viện dành cho PHP tại địa chỉ này https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/index.html
Để cài đặt ta chỉ cần sử dụng composer:
1678931355130.png

Một vài ví dụ khi sử dụng:
1678931380692.png

Nôm na là tạo một biến $client để gửi các request thực hiện các yêu cầu đến server ElasticSearch và nhận kết quả.
Tích hợp với Laravel Eloquent Model
Để kết hợp ElasticSearch với Laravel có rất nhiều packages có thể làm được. Ví dụ như: Plastic, Elasticsearch Eloquent, elasticsearcher,... Nhưng trong phạm vi bài viết này mình sẽ giới thiệu package Elasicquent. Đây là 1 package giúp chúng ta làm việc với ElasticSearch và Eloquent một cách dễ dàng hơn. Ta có thể tạo index và tìm kiếm ngay trong Eloquent Model.
Ta có thể cài đặt dễ dàng qua composer:
1678931410092.png

Thêm providers và aliases:
1678931418405.png

Thêm ElasticquentTrait vào Model mà bạn muốn sử dụng để index với ElasticSearch.
1678931429895.png

Elasticsearch Configuration: php artisan vendor:publish --provider="Elasticquent\ElasticquentServiceProvider"
1678931522079.png

Demo với Laravel
Để thực hiện demo với Laravel ta tạo model và data để test như sau:
1678931545868.png

1678931555709.png

1678931574709.png

Sau khi chạy seed ta đã có một bảng dữ liệu cơ bản để test. Tiếp theo ta sẽ setup Elasticquent trong model Post:
1678931592143.png

Các thuộc tính trong $mappingProperties chính là các trường cần đánh index. Và kiểu analyzer = stanard chính là việc tự động tách từ theo space trong quá trình phân tích dữ liệu đưa vào đánh index. Và bây giờ để đánh index cho Post ta dùng tinker và chạy command
1678931605988.png

Sau khi đã add vào index ta có thể kiểm tra bằng cách truy cập localhost:9200/ten_index với tên index chính là tên đã setup trong file config/elasticquent.php nếu ra kết quả thì có nghĩa là đã thêm index thành công. Bây giờ ta thử search theo ElasticSearch nhé:
1678931622288.png

Kết quả như sau:

Như vậy ta search theo title match với chữ "Illo" cho ra 3 kết quả. Ngoài ra còn nhiều hàm nữa của Elasticquent có thể xem thêm ở đây.
 
Bên trên