MySQL - 布爾全文搜索

Hello, 動手實作的資料庫愛好者們!今天,我們將要深入探討MySQL的布爾全文搜索這個引人入勝的領域。作為你們友善的鄰居計算機老師,我非常興奮能夠引導你們進行這次旅程。如果你是編程新手,別擔心——我們會從基礎開始,逐步深入。所以,來一杯咖啡(或者如果你喜歡,來一杯茶),我們開始吧!

MySQL - Boolean Fulltext Search

什麼是MySQL布爾全文搜索?

想像一下,你在一個巨大的圖書館裡尋找一本特定的書。如果你能告訴圖書管理員,“我想要一本關於龍的書,但不要關於騎士的,而且它必須提到魔法”,這不是很好嗎?這正是MySQL布爾全文搜索為你的數據庫所做的!

MySQL布爾全文搜索是一個強大的功能,它允許你在大量的文本數據中搜索特定的單詞或短語。這就像為你的數據庫請來了一位超級聰明的圖書管理員,他能夠迅速找到你正在尋找的東西。

讓我們從一個簡單的例子開始:

CREATE TABLE books (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255),
description TEXT,
FULLTEXT(description)
);

INSERT INTO books (title, description) VALUES
('The Dragon\'s Quest', 'A magical adventure with dragons and wizards'),
('Knight\'s Tale', 'A story of brave knights and their quests'),
('Enchanted Forest', 'Magical creatures in a mysterious forest');

SELECT * FROM books
WHERE MATCH(description) AGAINST('dragons +magical -knights' IN BOOLEAN MODE);

在這個例子中,我們創建了一個名為 'books' 的表並添加了一些樣本數據。最後一個查詢就是魔法發揮的地方。它會搜索以下書籍:

  • 包含單詞 'dragons'
  • 必須包含單詞 'magical'(这就是 '+' 的作用)
  • 不包含單詞 'knights'(这就是 '-' 的作用)

結果是?它會返回 'The Dragon's Quest',因為它符合所有這些標準。

MySQL布爾全文搜索操作符

現在,讓我們看看我們可以在布爾全文搜索中使用的一些操作符。把這些當作是我們數據庫圖書管理員的特別指示:

操作符 描述 示例
+ 必須包含這個單詞 +dragon
- 不包含這個單詞 -knight
> 提高相關性 >magic
< 降低相關性 <forest
* 通用符號(匹配任何結尾) drag*
" " 精確短語 "magic wand"
() 組合 (+magic +wand) -broom

讓我們看看這些是如何運作的:

SELECT * FROM books
WHERE MATCH(description) AGAINST('>magic +creatures -knights ("enchanted forest")' IN BOOLEAN MODE);

這個查詢會尋找以下書籍:

  • 預先包含 'magic'(但不強制)
  • 必須包含 'creatures'
  • 不包含 'knights'
  • 應該包含精確短語 "enchanted forest"

你能猜出它會返回哪本書嗎?沒錯,就是 'Enchanted Forest'!

MySQL布爾全文搜索功能

相關性評分

布爾全文搜索最酷的功能之一就是相關性評分。MySQL 不僅找到匹配的結果;它還會根據匹配程度對它們進行評分。

SELECT *, MATCH(description) AGAINST('magic dragons' IN BOOLEAN MODE) AS relevance
FROM books
WHERE MATCH(description) AGAINST('magic dragons' IN BOOLEAN MODE)
ORDER BY relevance DESC;

這個查詢會返回所有包含 'magic' 或 'dragons' 的書籍,並根據這些術語的相關性進行排序。

通用搜索

記得上文提到的 '*' 運算符嗎?它對於找到不同結尾的單詞非常有用:

SELECT * FROM books
WHERE MATCH(description) AGAINST('mag*' IN BOOLEAN MODE);

這會找到包含 'magic'、'magical'、'mage' 等單詞的書籍。

精確短語搜索

當你想找到一個精確的短語時,使用引號:

SELECT * FROM books
WHERE MATCH(description) AGAINST('"magical adventure"' IN BOOLEAN MODE);

這只會返回包含精確短語 "magical adventure" 的書籍。

使用客戶端程序進行布爾全文搜索

雖然我們一直在直接使用SQL查詢,但在現實世界的情況中,你通常會使用一個客戶端程序與數據庫交互。以下是一個使用 mysql-connector 库的簡單Python示例:

import mysql.connector

def search_books(keyword):
conn = mysql.connector.connect(
host="localhost",
user="your_username",
password="your_password",
database="your_database"
)
cursor = conn.cursor()

query = "SELECT * FROM books WHERE MATCH(description) AGAINST(%s IN BOOLEAN MODE)"
cursor.execute(query, (keyword,))

results = cursor.fetchall()
for row in results:
print(f"Title: {row[1]}, Description: {row[2]}")

cursor.close()
conn.close()

search_books('+magic -knights')

這個函數連接到你的MySQL數據庫,執行布爾全文搜索,並打印結果。

至此,各位!我們已經穿越了MySQL布爾全文搜索的領域,從基本概念到實際應用。記住,像任何強大的工具一樣,它需要練習才能精通。所以不要害怕嘗試和犯錯誤——這是我們學習的方式!

在我們結束之前,這裡有一個我教學日子的小故事:我曾經有一個學生,他在數據庫搜索上遇到困難。他一直試圖通過檢查每一根草來在 haystack 中找到一根針。當我向他介紹全文搜索時,他的眼睛亮了起來,就像他剛剛發現了魔法。在某種程度上,他的確做到了!因為好的技術就是這樣——它讓不可能的事情看起來像魔法。

持續練習,保持好奇心,並且愉快地搜索!

Credits: Image by storyset