MySQL 自然语言全文搜索
然语言全文搜索将搜索字符串解释为自然人类语言中的文字短语。它不支持特殊字符。如果未指定修饰符或指定了 IN NATURAL LANGUAGE MODE 修饰符,则默认启用。
在这种搜索模式下,MySQL会搜索与自然人类语言查询相关的每一行。我们可以在正浮点数中找到相关性。如果为零,则表示没有相似性。相关性是根据各种因素计算的,包括单词数、唯一单词数、集合中的单词总数以及包含特定单词的行数。
我们可以使用MATCH()和AGAINST()函数执行自然语言全文搜索。MATCH() 函数用于指定我们要在其中执行搜索的列名,而 AGAINST() 函数确定要使用的搜索字符串。
一、MySQL 自然语言全文搜索 语法
让我们首先创建一个带有 FULLTEXT 索引的表posts ,其中包括title和descriptions列。这是查询:
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中看到停用词列表。
热门文章
优秀文章