MySQL 全文本搜索
全文本搜索 将搜索字符串解释为自然人类语言中的文字短语 。它不支持特殊字符。如果未指定修饰符或指定了IN NATURAL LANGUAGE MODE修饰符,则默认启用该模式。
在这种搜索模式下,MySQL对与自然人类语言查询相关的每一行进行搜索。我们可以在 正浮点数 中找到相关性。如果为零,则表示没有相似性。相关性是基于各种因素进行计算的,包括词数、唯一词数、集合中的总词数以及包含特定词的行数。
我们可以使用 MATCH() 和 AGAINST() 函数进行自然语言全文本搜索。MATCH()函数用于指定要进行搜索的列名,而AGAINST()函数确定要使用的搜索字符串。
示例
首先让我们创建一个带有包括 标题 和 描述 列的全文索引的 posts 表。查询如下:
mysql> CREATE TABLE Posts (
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
descriptions TEXT,
FULLTEXT (title, descriptions)
) ENGINE = InnoDB;
接下来,我们将向该表中填充记录来解释全文搜索:
mysql> INSERT INTO Posts VALUES
('0', 'MySQL Tutorial', 'MySQL tutorial provides basic and advanced concepts for beginners ...'),
('0', 'Java Regex', 'Java Regex is a regular expression for searching or manipulating strings. ...'),
('0', 'MySQL Workbench','It is a GUI tool used to work with database ....'),
('0', 'What is Java', 'Java is a platform-indipendent, object-oriented and secure language ...'),
('0', 'MySQL Versions', 'This section shows all MySQL versions ...');
我们将使用MATCH()和AGAINST()函数进行全文搜索,如下所示:
mysql> SELECT * FROM Posts
WHERE MATCH (title, descriptions) AGAINST ('Java');
以下是我们对字符串 “tutorial” 执行全文搜索的输出结果:
如果你想获取包含 Java 和 Workbench 术语的帖子信息,我们可以使用以下语法:
mysql> SELECT * FROM Posts
WHERE MATCH (title, descriptions) AGAINST ('Java, Workbench');
执行该语句,我们将得到以下结果:
我们知道AGAINST()函数默认使用IN NATURAL LANGUAGE MODE搜索修饰符;这就是为什么我们可以省略它在查询中。让我们在上述语句中使用IN NATURAL LANGUAGE MODE搜索修饰符并查看结果:
mysql> SELECT * FROM Posts
WHERE MATCH (title, descriptions) AGAINST ('Java, Workbench' IN NATURAL LANGUAGE MODE);
执行查询,我们将得到与之前相同的结果:
如果我们想要 计算匹配的次数 ,我们可以使用以下查询:
mysql> SELECT COUNT(*) FROM Posts
WHERE MATCH (title, descriptions) AGAINST ('Java, Workbench' IN NATURAL LANGUAGE MODE);
这是结果:
如果我们想要明确地检索相关性值,则需要使用以下语法。该语句不会按顺序返回行,因为它既不使用WHERE子句,也不使用ORDER BY子句:
mysql> SELECT id, MATCH (title, descriptions)
AGAINST ('Java, Workbench' IN NATURAL LANGUAGE MODE) FROM Posts;
执行这个查询,我们将得到期望的结果:
如果我们想要检查文本相关性并根据相关性降序排序行,可以使用以下查询:
mysql> SELECT id, title, MATCH (title, descriptions)
AGAINST ('Java, Workbench' IN NATURAL LANGUAGE MODE) AS relevance_score
FROM Posts WHERE MATCH (title, descriptions)
AGAINST ('Java, Workbench' IN NATURAL LANGUAGE MODE);
执行查询,我们将获得期望的结果:
我们在使用MySQL的全文搜索时,务必考虑以下几点: :
- MySQL全文搜索引擎将搜索词的最小长度定义为 4 。这意味着MySQL不会返回任何关键词长度小于4的结果,比如dog,jug等。
- 它还会忽略停用词。我们可以在MySQL源代码发行版的 storage/myisam/ft_static.c 中看到停用词列表。