MySQL 布尔全文搜索

17 Mar 2025 | 5 分钟阅读

布尔搜索模式是 MySQL 中全文搜索的另一种形式。它比自然语言搜索更侧重于单词,这意味着它搜索的是单词而不是概念。它允许我们根据包含布尔运算符的非常复杂的查询进行搜索,例如小于(<)或大于(>)运算符、加号(+)和减号(-)符号、子表达式(“(”和“)”)、双引号(“”)、降低结果值贡献的运算符(~)和通配符。

因此,这种搜索模式适合有经验的用户,因为它提供了一种执行一些高级搜索的方法。通过在 AGAINST 函数中包含IN BOOLEAN MODE 修饰符,我们可以以这种模式执行全文搜索。

让我们用一个基本示例来理解它。假设我们有一个名为 posts 的表,其中包含以下数据

MySQL BOOLEAN FULLTEXT SEARCH

以下示例显示了如何搜索名称包含“Java”一词的帖子的标题的结果

执行查询将返回包含 Java 字样的两个帖子名称

MySQL BOOLEAN FULLTEXT SEARCH

假设我们想获取帖子名称包含“MySQL”一词但排除包含“Java”一词的其他行的帖子。在这种情况下,我们可以使用排除布尔运算符(-)来获得所需的结果。请看以下查询

执行查询将返回包含 MySQL 字样但不包含 Java 字样的帖子名称

MySQL BOOLEAN FULLTEXT SEARCH

相关性分数

MATCH() 函数为表中的每一行分配一个相关性值,并按相关性最高优先的顺序排列它们。此值决定了它与搜索词的相关程度。相关性分数始终是非负浮点数

如果要检查文本相关性并将行按相关性最高优先排序,可以使用以下查询

执行查询,我们将获得所需的结果

MySQL BOOLEAN FULLTEXT SEARCH

以下是另一个示例,列出了每一行的相关性值,即使值为零。我们可以在 WHERE 子句 中使用 MATCH() 函数而无需使用 MATCH() 函数来获取此结果。这是语句

执行查询,我们将获得所需的结果

MySQL BOOLEAN FULLTEXT SEARCH

MySQL 布尔全文搜索运算符

此表显示了全文布尔搜索模式中使用的运算符及其含义

运算符描述
+前导或尾随加号表示在每行返回的行中必须存在搜索字符串。
-前导或尾随减号表示搜索字符串不得出现在任何返回的行中。
>它用于更改单词对分配给行的相关性值的贡献。> 运算符增加相关性值。
<它用于更改单词对分配给行的相关性值的贡献。> 运算符降低相关性值。
*它表示单词末尾的通配符。
~它充当否定运算符,否定单词的排名值。它在标记停用词时很有用。
""它定义了用双引号(")括起来的短语。它匹配整个短语进行包含或排除,而不是单个单词。
()括号运算符用于将单词分组为子表达式。它们也可以嵌套,并允许它们作为一个组被包含、排除、排名等等。
@distance它仅用于 InnoDB 表,用于测试两个或多个单词是否在指定的距离内开始。
无运算符如果我们既没有使用加号运算符也没有使用减号运算符,默认情况下,该单词是可选的,但相关性更高的行将被排名更高。

让我们看一些说明在搜索查询中使用布尔全文运算符的各种示例:

1. 如果我们要搜索至少包含以下单词之一的行:Java 或 tutorial,可以使用以下语句

2. 如果我们要搜索包含两个单词的行:Java 和 tutorial,可以使用以下语句

3. 如果我们要搜索包含 Java 字样的行,但对包含 MySQL 的行给予更高的排名

4. 如果我们要搜索包含 Java 字样的行,但对包含 MySQL 的行给予较低的排名

5. 如果我们要查找包含以“my”开头的单词的行,例如“MySQL”,则使用以下查询

MySQL 布尔全文搜索特性

  • MySQL 布尔全文搜索不会自动按降序相关性对行进行排序。
  • 如果要在 InnoDB 表中执行布尔查询,则需要在 MATCH 表达式的所有列上进行全文索引。但是,在 MyISAM 表中则不需要,但搜索速度会变慢。
  • InnoDB 表上的全文搜索不支持单个搜索词上的多个布尔运算符,例如“++database”。如果这样做,MySQL 将返回语法错误。但是,它可以在 MyISAM 表中处理,这些表会忽略其他运算符并使用与搜索词相邻的运算符;例如,“+-database”将变为“-database”。
  • InnoDB 全文搜索仅支持前导加号(+)或减号(-),不支持尾随加号或减号。如果这样做,MySQL 将报告语法错误。例如,我们可以搜索“+database”但不能在 InnoDB 中搜索“database-”。此外,我们不能将前导加号或减号与通配符字符一起使用:+*、+- 等。
  • MySQL 将忽略搜索结果中的50% 阈值(该词出现在超过 50% 的行中)。
  • MySQL InnoDB 全文搜索确实允许在布尔全文搜索中使用 @ 符号