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中看到停用词列表。

热门文章

优秀文章