Full Text Search with Scout and Algolia Packages
Bài đăng này đã không được cập nhật trong 3 năm
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
- 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"
- 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
All rights reserved