MySQL 自然语言 FULLTEXT 搜索

2025年3月17日 | 阅读 3 分钟

自然语言 FULLTEXT 搜索 将搜索字符串解释为自然人类语言中的字面短语。它不支持特殊字符。如果未指定修饰符或指定了 IN NATURAL LANGUAGE MODE 修饰符,则默认启用它。

在此搜索模式下,MySQL 对与自然人类语言查询相关的每一行执行搜索。我们可以通过一个正浮点数来表示相关性。如果为零,则表示没有相似性。相关性是根据各种因素计算的,包括单词数量、唯一单词数量、集合中的总单词数量以及包含特定单词的行数。

我们可以使用 MATCH()AGAINST() 函数执行自然语言全文搜索。MATCH() 函数用于指定要执行搜索的列名,AGAINST() 函数用于确定要使用的搜索字符串。

示例

让我们首先创建一个名为 posts 的表,其中包含一个 FULLTEXT 索引,包括 titledescriptions 列。查询如下:

接下来,我们将向此表中填充记录,以解释全文搜索。

我们现在将使用 MATCH() 和 AGAINST() 函数执行全文搜索,如下所示:

这是我们对字符串 "tutorial" 执行全文搜索后的输出:

MySQL Natural Language FULLTEXT Search

如果您想获取包含 JavaWorkbench 词语的帖子信息,可以使用以下语法:

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

MySQL Natural Language FULLTEXT Search

我们知道 AGAINST() 函数默认使用 IN NATURAL LANGUAGE MODE 搜索修饰符;因此,我们可以在查询中省略它。让我们在上面的语句中使用 IN NATURAL LANGUAGE MODE 搜索修饰符,看看结果。

执行查询,我们将得到与之前相同的结果。

MySQL Natural Language FULLTEXT Search

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

这是结果:

MySQL Natural Language FULLTEXT Search

如果我们想明确检索相关性值,我们需要使用以下语法。此语句不排序返回的行,因为它既不使用 WHERE 也不使用 ORDER BY 子句。

执行查询,我们将得到期望的结果。

MySQL Natural Language FULLTEXT Search

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

执行查询,我们将得到期望的结果。

MySQL Natural Language FULLTEXT Search

在使用 MySQL 全文搜索时,我们必须考虑以下几点::

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

下一主题布尔全文搜索