Full Text Search with Scout and Algolia Packages

Tìm kiếm trong MySQL

Toán tử IN

Toán tử IN được sử dụng trong một mệnh đề WHERE để kiểm tra giá trị của field đó có nằm trong một tập hợp nào đó hay không. SELECT id, title, description FROM book WHERE title IN ('Lộc Đỉnh Ký','Ỷ Thiên Đồ Long Kí')

Nếu không sử dụng IN thì ta sẽ dùng toán tử OR để tạo điều kiện: SELECT id, title, description FROM book WHERE title = 'Lộc Đỉnh Ký' OR title = 'Ỷ Thiên Đồ Long Kí'

Toán tử LIKE

Toán tử LIKE được sử dụng trong một mệnh đề WHERE để tìm kiếm một bản ghi xác định trong một cột. Có hai ký tự đại diện được sử dụng kết hợp với toán tử LIKE: “%” : Biểu tượng phần trăm thể hiện 0, một hoặc nhiều ký tự. “_” : Dấu gạch dưới biểu thị một ký tự đơn.

SELECT id, title, description FROM book WHERE title LIKE ‘%keyword%’

Query Mean
WHERE title LIKE ’"%" Tìm các bản ghi có title bắt đầu là “a”
WHERE title LIKE ’"a" Tìm các bản ghi có title kết thúc “a”
WHERE title LIKE ’"or%" Tìm các bản ghi có title là “or” tại bất kì vị trí nào
WHERE title LIKE "_r%" Tìm các bản ghi có title là “r” tại vị trí thứ 2
WHERE title LIKE "a_%_%" Tìm các bản ghi có title bắt đầu là “a” và có ít nhất 3 ký tự
WHERE author LIKE "a%o" Tìm các bản ghi có author bắt đầu là “a” và kết thúc là “o”

Hạn chế:

  • Khi không đánh index thì tốc độ tìm kiếm chậm.
  • Kết quả tìm kiếm nhiều nhưng độ nhiễu cao, từ đồng nghĩa nhiều.
  • Gặp vấn đề trong tìm kiếm tiếng việt có dấu và không dấu. (Lưu ý: đó là những hạn chế chung trong MySQL, ngay cả full text search của MySQL cũng không giải quyết triệt để các vấn đề này mà phải dùng các search engine ngoài như Algolia , ElacticSearch , v.v )

Fulltext-Search là gì?

Fulltext Search là cách tự nhiên nhất để tìm kiếm thông tin. Hệt như Google, ta chỉ cần gõ từ khóa và nhấn enter thế là có kết quả trả về.

Nhắc đến FullText Search ta không thể không nhắc đến Inverted Index , đây là 1 kĩ thuật index trong database, một kĩ thuật quan trọng trong Fulltext Search. Thế Inverted Index là gì?

Inverted Index là một cấu trúc dữ liệu, nhằm mục đích map giữa các từ hay chữ số và các document chứa chúng.

Kỹ thuật Inverted Index

Để dễ hiểu, các bạn xem ví dụ dưới đây:

Document1 = "Tam is Developer"
Document2 = "Developer C#"
Document3 = "Tam is Developer and Student"

Và Inverted Index được lưu như sau:

"Tam" => {Document1,Document3}
"is" => {Document1, Document3}
"Developer" => {Document1, Document2, Document3}
"C#" => {Document2}
"and" => {Document3}
"Student" => {Document3}

Cách hoạt động Đầu tiên hệ thống nó sẽ tách chuỗi tìm kiếm ra thành các từ Tam, is, Developer. Sau đó sẽ tìm trong inverted index và được các tập hợp như sau:

{Document1,Document3}
{Document1,Document3}
{Document1,Document2,Document3}

Sau đó union các tập hợp lại

{Document1,Document3} union {Document1,Document3} 
union {Document1, Document2, Document3} => {Document1}

Kỹ thuật Fuzzy Search

Fuzzy Seach (tìm kiếm “mờ”) hay còn hay được gọi là Approximate Search (tìm kiếm “xấp xỉ”) là khái niệm để chỉ kỹ thuật để tìm kiếm một xâu “gần giống” (thay vì “giống hệt” ) so với một xâu cho trước.

Nhập: "hoag ngu tam"
Kết quả: "hoang nhu tam"
Hay như khi vào Google bạn gõ "frangia vietnam" thì Google sẽ gợi ý cho bạn là "Did you mean: framgia vietnam".

So sánh Substring

Nó giống LIKE trong SQL. Giả sử như người dùng nhập vào xâu “ framgia ”, bạn có thể trả về những kết quả có chứa từ “framgia” như “ framgia Vietnam ”, “ lap trinh vien framgia ”.

Khoảng cách Levenshtein

Khoảng cách Levenshtein là số bước ít nhất biến một xâu A thành xâu B thông qua 3 phép biến đổi:

  • Thêm một ký tự
  • Bớt một ký tự
  • Thay đổi một ký tự

Áp dụng FTS với Scout and Algolia Packages

Bước 1. Cài đặt ứng dụng Laravel
composer create-project --prefer-dist laravel/laravel blog

Bước 2. Cài đặt Packages

  1. laravel/scout composer require laravel/scout Sau khi chạy câu lệnh thành công, mở file “config/app.php” và thêm service provider.
'providers' => [
   Laravel\Scout\ScoutServiceProvider::class,
]

Chạy câu lệnh để tạo file scout.php trong thư mục config: php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"

  1. algolia/algoliasearch-client-php composer require algolia/algoliasearch-client-php

Bước 3. Cấu hình cho Packages
Giờ bạn hãy mở file .env và thêm id và sercet vào như dưới đây.

ALGOLIA_APP_ID=<app id>
ALGOLIA_SECRET=<app secret>

Bước 4. Thiết lập Model

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

class Post extends Model
{
   use Searchable;
}

Bước 5: Cấu hình chỉ mục

class Post extends Model
{
   public function searchableAs()
   {
      return 'content';
   }

   public function toSearchableArray()
   {
      $array = $this->toArray();
      return $array;
   }
}

Bước 6: Đánh chỉ mục
php artisan scout:import "App\Post"

Bước 7: Truy vấn

Route::get('/search', function (Request $request) {
   return App\Post::search($request->search)->get();
});

Tham khảo