MySQL - ngram 全文解析器:初學者指南

哈囉,未來的資料庫魔法師!今天,我們即將展開一場令人興奮的旅程,深入探索 MySQL 的 ngram 全文解析器的世界。如果您是程式設計的新手,別擔心 - 我將是您友善的嚮導,一步一步為您解釋一切。所以,拿一杯咖啡,讓我們潛入其中!

MySQL - ngram Fulltext Parser

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