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 Tutorial', 'MySQL is a popular database'),
('Python Guide', 'Python is a programming language');

现在,让我们搜索“popular database”:

SELECT * FROM articles
WHERE MATCH(content) AGAINST('popular database' IN BOOLEAN MODE);

这应该返回我们的“MySQL Tutorial”文章。

ngram 解析器的术语搜索

我们也可以搜索单个术语。让我们尝试搜索“programming”:

SELECT * FROM articles
WHERE MATCH(content) AGAINST('programming' IN BOOLEAN MODE);

这应该返回我们的“Python Guide”文章。

ngram 解析器的通配符搜索

ngram 解析器在传统意义上不支持通配符搜索。然而,由于它将单词分解成小块,它仍然可以找到部分匹配。例如:

SELECT * FROM articles
WHERE MATCH(content) AGAINST('prog' IN BOOLEAN MODE);

这可能仍然会找到我们的“programming”文章,即使我们只搜索了单词的一部分。

在客户端程序中使用 ngram 全文解析器

最后,让我们看看如何在 Python 程序中使用 ngram 解析器:

import mysql.connector

# 连接到数据库
cnx = mysql.connector.connect(user='your_username', password='your_password',
host='127.0.0.1', database='your_database')
cursor = cnx.cursor()

# 执行搜索
query = "SELECT * FROM articles WHERE MATCH(content) AGAINST(%s IN BOOLEAN MODE)"
search_term = 'database'

cursor.execute(query, (search_term,))

# 打印结果
for (id, title, content) in cursor:
print(f"ID: {id}, Title: {title}, Content: {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