MySQL 全文本搜索

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” 执行全文搜索的输出结果:

MySQL 全文本搜索

如果你想获取包含 JavaWorkbench 术语的帖子信息,我们可以使用以下语法:

mysql> SELECT * FROM Posts 
WHERE MATCH (title, descriptions) AGAINST ('Java, Workbench');

执行该语句,我们将得到以下结果:

MySQL 全文本搜索

我们知道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 全文本搜索

如果我们想要 计算匹配的次数 ,我们可以使用以下查询:

mysql> SELECT COUNT(*) FROM Posts 
WHERE MATCH (title, descriptions) AGAINST ('Java, Workbench' IN NATURAL LANGUAGE MODE);

这是结果:

MySQL 全文本搜索

如果我们想要明确地检索相关性值,则需要使用以下语法。该语句不会按顺序返回行,因为它既不使用WHERE子句,也不使用ORDER BY子句:

mysql> SELECT id, MATCH (title, descriptions) 
AGAINST ('Java, Workbench' IN NATURAL LANGUAGE MODE) FROM Posts;

执行这个查询,我们将得到期望的结果:

MySQL 全文本搜索

如果我们想要检查文本相关性并根据相关性降序排序行,可以使用以下查询:

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的全文搜索时,务必考虑以下几点:

  • MySQL全文搜索引擎将搜索词的最小长度定义为 4 。这意味着MySQL不会返回任何关键词长度小于4的结果,比如dog,jug等。
  • 它还会忽略停用词。我们可以在MySQL源代码发行版的 storage/myisam/ft_static.c 中看到停用词列表。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程