MySQL - Tìm kiếm全文: Hướng dẫn cho người mới bắt đầu

Xin chào các bạnfuture database wizards! Hôm nay, chúng ta sẽ bắt đầu một hành trình thú vị vào thế giới của MySQL Full-Text Search. Đừng lo lắng nếu bạn mới làm quen với lập trình - tôi sẽ là người bạn thân thiện của bạn, giải thích các khái niệm phức tạp thành những phần nhỏ, dễ tiêu hóa. Vậy, hãy lấy một cốc cà phê (hoặc trà, nếu đó là sở thích của bạn), và cùng nhau bắt đầu nhé!

MySQL - Fulltext Search

MySQL Full-Text Search là gì?

Hãy tưởng tượng bạn đang cố gắng tìm một cuốn sách cụ thể trong một thư viện khổng lồ. Bạn có thể đi qua từng cuốn sách một, nhưng điều đó sẽ mất rất nhiều thời gian! Đó là lúc Full-Text Search ra vào cuộc giải cứu. Nó giống như có một thư thư viện siêu thông minh có thể quét qua tất cả các cuốn sách và tìm chính xác thứ bạn đang tìm kiếm.

Trong thuật ngữ MySQL, Full-Text Search là một tính năng mạnh mẽ cho phép bạn tìm kiếm qua một lượng lớn dữ liệu văn bản nhanh chóng và hiệu quả. Nó đặc biệt hữu ích khi bạn cần tìm kiếm các từ hoặc cụm từ trong các trường văn bản dài, như bài viết blog hoặc mô tả sản phẩm.

Các điểm chính của MySQL Full-Text Search

Trước khi chúng ta bắt đầu viết mã, hãy cùng xem qua một số điểm chính:

  1. Tốc độ: Full-Text Search nhanh hơn nhiều so với việc sử dụng các truy vấn LIKE cho tìm kiếm văn bản.
  2. Relevance: Nó có thể xếp hạng kết quả dựa trên mức độ liên quan đến từ khóa tìm kiếm của bạn.
  3. Độ linh hoạt: Bạn có thể tìm kiếm cụm từ chính xác hoặc từng từ.
  4. Từ vựng bỏ qua: Các từ phổ biến như "the" hoặc "and" bị bỏ qua để cải thiện hiệu quả tìm kiếm.
  5. Độ dài từ tối thiểu: Mặc định, các từ ngắn hơn 4 ký tự không được chỉ mục.

Các loại tìm kiếm Full-Text

MySQL cung cấp ba loại tìm kiếm Full-Text:

Loại tìm kiếm Mô tả Ví dụ sử dụng
Natural Language Mode Chế độ mặc định, tìm kiếm từ và cụm từ Tìm kiếm "healthy recipes"
Boolean Mode Cho phép các truy vấn phức tạp hơn bằng cách sử dụng các toán tử Tìm kiếm "healthy +recipes -desserts"
Query Expansion Mở rộng tìm kiếm dựa trên ý nghĩa của từ Tìm kiếm "car" có thể cũng trả về kết quả cho "automobile"

Hãy cùng xem chi tiết từng loại này!

Natural Language Mode

Đây là chế độ mặc định và đơn giản nhất của Full-Text search. Nó giống như hỏi một người bạn, "Này, bạn có biết bất kỳ công thức nào tốt cho món ăn lành mạnh không?"

SELECT * FROM recipes
WHERE MATCH(title, content) AGAINST('healthy recipes');

Trong ví dụ này, MySQL sẽ tìm kiếm các mục trong bảng 'recipes' mà các cột 'title' hoặc 'content' chứa các từ 'healthy' và 'recipes', xếp hạng kết quả dựa trên mức độ liên quan.

Boolean Mode

Chế độ Boolean giống như một thám tử, đưa ra các hướng dẫn cụ thể cho MySQL về những gì cần bao gồm hoặc loại trừ. Nó非常适合 cho các tìm kiếm phức tạp hơn.

SELECT * FROM recipes
WHERE MATCH(title, content) AGAINST('+healthy +recipes -desserts' IN BOOLEAN MODE);

Truy vấn này sẽ tìm các công thức phải bao gồm 'healthy' và 'recipes', nhưng loại trừ bất kỳ công thức nào đề cập đến 'desserts'. Dấu '+' có nghĩa là "phải bao gồm", và dấu '-' có nghĩa là "phải không bao gồm".

Query Expansion

Query expansion giống như có một từ điển đồng nghĩa trong tìm kiếm của bạn. Nó rất hữu ích khi bạn muốn tìm kiếm các kết quả liên quan mà có thể không bao gồm từ khóa tìm kiếm chính xác của bạn.

SELECT * FROM recipes
WHERE MATCH(title, content) AGAINST('car' WITH QUERY EXPANSION);

Điều này có thể trả về kết quả cho 'automobile', 'vehicle', hoặc thậm chí các nhãn hiệu xe cụ thể, ngay cả khi từ 'car' không được đề cập rõ ràng.

Tạo chỉ mục FULLTEXT MySQL

Trước khi chúng ta có thể sử dụng Full-Text Search, chúng ta cần tạo một chỉ mục FULLTEXT. Hãy tưởng tượng như tạo một catalo đặc biệt cho thư thư viện của chúng ta (MySQL) để sử dụng.

Dưới đây là cách bạn có thể tạo một chỉ mục FULLTEXT:

CREATE TABLE articles (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200),
content TEXT,
FULLTEXT (title, content)
);

Trong ví dụ này, chúng ta đang tạo một bảng叫做 'articles' với một chỉ mục FULLTEXT trên cả hai cột 'title' và 'content'.

Bạn cũng có thể thêm một chỉ mục FULLTEXT vào một bảng hiện có:

ALTER TABLE articles
ADD FULLTEXT (title, content);

Xóa chỉ mục FULLTEXT MySQL

Đôi khi, bạn có thể cần xóa bỏ một chỉ mục FULLTEXT. Nó giống như nói với thư thư viện, "Cảm ơn, nhưng chúng tôi không cần catalo đặc biệt này nữa."

Dưới đây là cách bạn có thể xóa bỏ một chỉ mục FULLTEXT:

ALTER TABLE articles
DROP INDEX title;

Lệnh này xóa bỏ chỉ mục FULLTEXT có tên 'title' từ bảng 'articles'.

Tìm kiếm Full-Text sử dụng chương trình khách

Bây giờ, hãy kết hợp tất cả lại và xem cách chúng ta có thể sử dụng Full-Text Search trong một tình huống thực tế. Hãy tưởng tượng chúng ta đang xây dựng một công cụ tìm kiếm công thức nấu ăn cho một trang web nấu ăn.

Đầu tiên, hãy tạo bảng của chúng ta và thêm một số dữ liệu:

CREATE TABLE recipes (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200),
content TEXT,
FULLTEXT (title, content)
);

INSERT INTO recipes (title, content) VALUES
('Healthy Banana Smoothie', 'Blend bananas, yogurt, and honey for a quick and healthy breakfast.'),
('Grilled Chicken Salad', 'Grill chicken breast and toss with fresh greens, tomatoes, and a light vinaigrette.'),
('Chocolate Chip Cookies', 'Mix flour, sugar, butter, and chocolate chips. Bake until golden brown.');

Bây giờ, hãy tìm kiếm các công thức lành mạnh:

SELECT * FROM recipes
WHERE MATCH(title, content) AGAINST('healthy' IN NATURAL LANGUAGE MODE);

Truy vấn này sẽ trả về công thức Smoothie chuối, vì nó là duy nhất có từ 'healthy' trong tiêu đề hoặc nội dung.

Hãy thử một tìm kiếm phức tạp hơn bằng cách sử dụng chế độ Boolean:

SELECT * FROM recipes
WHERE MATCH(title, content) AGAINST('+healthy +quick -chocolate' IN BOOLEAN MODE);

Truy vấn này sẽ trả về các công thức cả lành mạnh và nhanh, nhưng loại trừ bất kỳ công thức nào đề cập đến chocolate.

Và thế là xong! Bạn đã chính thức bước vào thế giới của MySQL Full-Text Search. Nhớ rằng, thực hành là cách tốt nhất để trở thành người thợ giỏi, vì vậy đừng ngần ngại thử nghiệm với các truy vấn và chế độ tìm kiếm khác nhau. Trước khi bạn biết, bạn sẽ tạo ra các chức năng tìm kiếm mạnh mẽ đến mức làm cho cả những thư thư viện có kinh nghiệm cũng phải ghen tị!

Chúc các bạn may mắn và tìm kiếm luôn nhanh chóng và chính xác!

Credits: Image by storyset