MySQL - ngram 全文解析器:初學者指南
哈囉,未來的資料庫魔法師!今天,我們即將展開一場令人興奮的旅程,深入探索 MySQL 的 ngram 全文解析器的世界。如果您是程式設計的新手,別擔心 - 我將是您友善的嚮導,一步一步為您解釋一切。所以,拿一杯咖啡,讓我們潛入其中!
ngram 全文解析器:有何了不起?
想像一下,您正在一個龐大的圖書館中尋找一本特定的書。如果您只需輸入幾個字就能立即找到您要找的東西,那不是很棒嗎?這正是 ngram 全文解析器為資料庫所做的!
ngram 解析器就像一位超聰明的圖書管理員,將文本分解成小塊(稱為 ngram),並幫助您快速有效地搜索它們。它對於像中文或日文這樣不使用單詞間空格的語言尤其有用。
什麼是 ngram?
ngram 是來自給定文本的 n 個連續項的序列。例如,如果我們有單詞“hello”且 n = 2(我們稱之為二元組),我們將得到:
- he
- el
- ll
- lo
相當不錯,對吧?現在,讓我們看看如何在 MySQL 中使用它!
配置 ngram 令牌大小
在我們開始使用 ngram 解析器之前,我們需要告訴它我們希望我們的 ngram 有多大。這稱為令牌大小。
以下是我們如何設置它:
SET GLOBAL ngram_token_size = 2;
這將我們的 ngram 大小設置為 2(二元組)。但請記住,您需要特殊權限才能更改全域變量。如果您剛開始,您的資料庫管理員可能需要為您執行此操作。
使用 ngram 解析器創建全文索引
現在我們已經設置了令牌大小,讓我們創建一個表並使用 ngram 解析器添加全文索引:
CREATE TABLE articles (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(200),
content TEXT,
FULLTEXT INDEX ngram_idx (content) WITH PARSER ngram
) ENGINE=InnoDB;
在此示例中,我們正在創建一個名為“articles”的表,具有“id”、“title”和“content”列。神奇之處在於最後一行,我們在“content”列上使用 ngram 解析器創建了全文索引。
ngram 解析器的空格處理
ngram 解析器的一個很酷的地方是它如何處理空格。它將它們視為任何其他字符。所以,“hello world”的二元組將是:
- he
- el
- ll
- lo
- o
- w
- wo
- or
- rl
- ld
這使其非常適合搜索短語!
ngram 解析器的停用詞處理
與其他一些解析器不同,ngram 解析器不使用停用詞。停用詞是像“the”或“and”這樣在搜索中經常被忽略的常見單詞。ngram 解析器包括一切,這取決於您的需求,可能是好的也可能是壞的。
ngram 解析器的短語搜索
讓我們嘗試短語搜索!首先,讓我們向我們的表中添加一些數據:
INSERT INTO articles (title, content) VALUES
('MySQL 教程', 'MySQL 是一個流行的資料庫'),
('Python 指南', 'Python 是一種程式設計語言');
現在,讓我們搜索“流行的資料庫”:
SELECT * FROM articles
WHERE MATCH(content) AGAINST('流行的資料庫' IN BOOLEAN MODE);
這應該返回我們的 MySQL 教程文章。
ngram 解析器的單詞搜索
我們也可以搜索單個單詞。讓我們嘗試搜索“程式設計”:
SELECT * FROM articles
WHERE MATCH(content) AGAINST('程式設計' IN BOOLEAN MODE);
這應該返回我們的 Python 指南文章。
ngram 解析器的通配符搜索
ngram 解析器在傳統意義上不支持通配符搜索。然而,因為它將單詞分解成小塊,它仍然可以找到部分匹配。例如:
SELECT * FROM articles
WHERE MATCH(content) AGAINST('prog' IN BOOLEAN MODE);
這可能仍然會找到我們的“程式設計”文章,即使我們只搜索了單詞的一部分。
在客戶端程式中使用 ngram 全文解析器
最後,讓我們看看如何在 Python 程式中使用 ngram 解析器:
import mysql.connector
# 連接到資料庫
cnx = mysql.connector.connect(user='您的用戶名', password='您的密碼',
host='127.0.0.1', database='您的資料庫')
cursor = cnx.cursor()
# 執行搜索
query = "SELECT * FROM articles WHERE MATCH(content) AGAINST(%s IN BOOLEAN MODE)"
search_term = '資料庫'
cursor.execute(query, (search_term,))
# 打印結果
for (id, title, content) in cursor:
print(f"ID: {id}, 標題: {title}, 內容: {content}")
# 關閉連接
cursor.close()
cnx.close()
此程式連接到您的 MySQL 資料庫,使用 ngram 解析器執行搜索,並打印出結果。
就是這樣,朋友們!我們已經穿越了 MySQL 中 ngram 全文解析的領域。記住,熟能生巧,所以不要害怕嘗試這些概念。在您意識到之前,您將像專業人士一樣解析和搜索!
方法 | 描述 |
---|---|
SET GLOBAL ngram_token_size = n |
配置 ngram 令牌的大小 |
CREATE TABLE... FULLTEXT INDEX... WITH PARSER ngram |
使用 ngram 解析器創建具有全文索引的表 |
INSERT INTO... VALUES... |
向表中插入數據 |
SELECT... WHERE MATCH(...) AGAINST(... IN BOOLEAN MODE) |
使用 ngram 解析器執行全文搜索 |
祝您編碼愉快,願您的查詢始終返回您想要的結果!
Credits: Image by storyset