MySQL 提供的全文检索功能使我们能够在庞大的文本数据中迅速找到相关信息。布尔模式(Boolean Mode)是 MySQL 中一种功能强大的搜索方式,它通过布尔符号来精确控制查询行为,从而提高搜索的精度和相关性。

在本文中,我们将详细介绍 MySQL 中布尔模式的使用方法,特别是如何通过布尔符号(如 +-*<>()& 和其他组合符号等)来优化查询,并解释这些符号的具体应用场景及其优化效果。

什么是 MySQL 全文检索的布尔模式?

布尔模式是 MySQL 中一种增强的全文检索模式,它允许开发者通过布尔运算符来控制检索行为,提供更细致的搜索精度。这种模式与 MySQL 默认的自然语言模式不同,布尔模式支持逻辑运算符、词汇权重设置、排除词等功能,适用于需要精确控制查询条件的场景。

布尔模式的优势包括:

  • 强制包含某些关键词。
  • 排除不需要的词汇。
  • 进行模糊匹配(例如通配符查询)。
  • 为关键词设置权重,调整搜索结果的排序。

MySQL 全文检索:布尔模式常用符号及其功能

可以执行SHOW VARIABLES LIKE 'ft_boolean_syntax';查看 MySQL 布尔模式支持的符号。

在 MySQL 的布尔模式下,开发者可以使用多种符号来灵活调整查询的逻辑,MySQL 的 ft_boolean_syntax 选项定义了布尔模式支持的符号集合,这些符号能够灵活地控制全文检索行为。以下是布尔模式中的常见符号及其说明:

0. 不加任何符号

如果查询字符串中没有加任何符号,MySQL 会默认将这些词当作自然语言查询来处理。在布尔模式下,这些词的匹配是基本的包含匹配,且不执行强制要求、排除或模糊匹配。

在没有符号时,查询将返回包含查询词的所有记录,这些记录按相关性排序。相关性是通过词频和其他因素(如词的常见度)来计算的。

示例

SELECT * FROM `table`
WHERE MATCH(column1, column2) AGAINST('keyword1 keyword2' IN BOOLEAN MODE);

此查询会返回所有包含 keyword1 和 keyword2 的记录,按照它们的相关性(出现频率等)排序,中间的空格类似于&

1. 加号 (+):强制匹配

  • 功能:加号用于表示查询中必须包含某个词,强制要求该词出现在匹配结果中。
  • 应用场景:当需要确保某个关键词必须出现在搜索结果中时使用。

示例

SELECT * FROM `table`
WHERE MATCH(column1, column2) AGAINST('+keyword1 +keyword2' IN BOOLEAN MODE);

此查询表示必须同时包含 keyword1keyword2 的记录。

2. 减号 (-):排除匹配

  • 功能:减号用于排除某个词,使得搜索结果中不包含此词。
  • 应用场景:用于去除包含特定词汇的结果。

示例

SELECT * FROM `table`
WHERE MATCH(column1, column2) AGAINST('+keyword1 -keyword2' IN BOOLEAN MODE);

在该查询中,keyword2 被排除,结果只包含 keyword1,且不包含 keyword2

3. 星号 (*):通配符匹配

  • 功能:星号是通配符,用于模糊匹配某个词的前缀,支持部分匹配。
  • 应用场景:用于模糊查询,特别是前缀匹配。

示例

SELECT * FROM `table`
WHERE MATCH(column1, column2) AGAINST('key*' IN BOOLEAN MODE);

该查询会返回所有以 key 开头的词(如 keywordkeynote 等)。

4. 尖括号 (<, >):设置词的权重

  • 功能:尖括号用于调整词的权重,< 后的数字表示低权重,> 后的数字表示高权重。
  • 应用场景:通过设置不同的权重,调整某些词在查询结果中的优先级。

示例

SELECT * FROM `table`
WHERE MATCH(column1, column2) AGAINST('>2 keyword1 >1 keyword2' IN BOOLEAN MODE);

在此查询中,keyword1 的权重为 2,keyword2 的权重为 1,因此包含 keyword1 的记录会排在前面。

5. 波浪号 (~):降低词的权重

  • 功能:波浪号用于降低某个词的权重,使得它在查询结果中的重要性较低。
  • 应用场景:当某个词不那么重要时,可以使用波浪号来降低其影响。

示例

SELECT * FROM `table`
WHERE MATCH(column1, column2) AGAINST('keyword1 ~keyword2' IN BOOLEAN MODE);

在该查询中,keyword2 的权重被降低,因此它对排序的影响较小。

6. 双引号 ("):精确匹配短语

  • 功能:双引号用于精确匹配一整个短语,要求词汇的顺序和空格完全一致。
  • 应用场景:用于精确匹配词组,而不是单个词。

示例

SELECT * FROM `table`
WHERE MATCH(column1, column2) AGAINST('"exact phrase"' IN BOOLEAN MODE);

此查询将匹配包含完整短语 "exact phrase" 的记录,而不是单独匹配 exactphrase

双引号(")还能结合其他符号使用,支持更复杂的短语查询:

示例

SELECT * FROM `table`
WHERE MATCH(column1, column2) AGAINST('+"exact phrase" -keyword' IN BOOLEAN MODE);

此查询要求结果中必须包含 exact phrase,并且排除包含 keyword 的记录。

7. 管道符号 (|):逻辑“OR”运算

  • 功能:管道符号表示“或”运算,允许匹配多个词中的任何一个。
  • 应用场景:用于多词查询,当希望返回匹配任一关键词的结果时使用。

示例

SELECT * FROM `table`
WHERE MATCH(column1, column2) AGAINST('keyword1 | keyword2' IN BOOLEAN MODE);

此查询会返回包含 keyword1keyword2 的记录。

8. 括号 (()): 组操作

  • 功能:括号用于将多个条件分组,从而定义操作的优先级。
  • 应用场景:在复杂查询中,通过括号控制逻辑运算的顺序,使查询更具逻辑性。

示例

SELECT * FROM `table`
WHERE MATCH(column1, column2) AGAINST('+(keyword1 keyword2) -keyword3' IN BOOLEAN MODE);

在这个查询中,keyword1keyword2 被视为一个整体(需要同时出现),而 keyword3 被排除。

9. 与符号 (&):逻辑“AND”运算

  • 功能:逻辑“AND”运算符,表示匹配必须同时满足多个条件。
  • 应用场景:在布尔模式下,默认情况下多个关键词之间即为“AND”逻辑,因此不需要显式使用 & 符号。但在某些情况下,出于逻辑清晰或更复杂操作的需求,& 可用于明确表达“AND”关系。

示例

SELECT * FROM `table`
WHERE MATCH(column1, column2) AGAINST('keyword1 & keyword2' IN BOOLEAN MODE);

与默认行为一致,此查询返回同时包含 keyword1keyword2 的记录。

布尔符号复杂逻辑组合:多符号联合

通过将多个布尔符号联合使用,可以实现高度灵活和复杂的查询逻辑。以下是一些常见的组合场景:

示例:组合排除与强制包含

SELECT * FROM `table`
WHERE MATCH(column1, column2) AGAINST('+keyword1 +(keyword2 | keyword3) -keyword4' IN BOOLEAN MODE);
  • 必须包含 keyword1
  • 必须至少包含 keyword2keyword3(逻辑“OR”运算)。
  • 排除包含 keyword4 的记录。

示例:权重与短语优先

SELECT * FROM `table`
WHERE MATCH(column1, column2) AGAINST('>"2 keyword phrase" ~keyword2 -keyword3' IN BOOLEAN MODE);
  • keyword phrase 权重较高,因此优先出现在结果中。
  • keyword2 的权重被降低,但不会完全排除。
  • 排除 keyword3

布尔模式的应用场景

MySQL 的布尔模式非常适合用于精确控制查询条件,特别是在以下场景:

  • 强制包含特定关键词:使用加号(+)确保某个词出现在结果中。
  • 排除特定词汇:使用减号(-)排除某些不需要的词。
  • 模糊匹配:使用星号(*)进行前缀或部分词的匹配。
  • 精确匹配短语:使用双引号(")精确匹配一个词组。
  • 调整关键词权重:通过尖括号(<, >)和波浪号(~)调整词汇的重要性。
  • 多条件查询:使用管道符号(|)进行逻辑“OR”运算。

布尔模式与自然语言模式的区别

  • 自然语言模式:MySQL 默认的全文检索模式,基于词频计算相关性,不支持复杂的逻辑操作。
  • 布尔模式:支持逻辑运算符、关键词权重设置等功能,适用于更精确的查询场景。

布尔模式提供了更强的灵活性,能够控制词汇的匹配和权重,因此适合复杂查询。自然语言模式更适合简化的关键词匹配,且不支持权重调整和排除词的功能。

总结

ft_boolean_syntax 的全貌:MySQL 的布尔模式通过一系列符号支持非常复杂的查询逻辑,这些符号的功能在如下列表中总结:

符号功能描述
+强制包含某词。
-排除某词。
*通配符,用于模糊匹配(词的前缀匹配)。
<, >调整词的权重(< 为降低,> 为提高)。
~降低某词的权重。
"精确匹配短语。
``逻辑“OR”运算符,表示匹配任意一个关键词。
&逻辑“AND”运算符,表示必须同时满足多个条件(通常可以省略,默认为“AND”关系)。
()分组操作,用于定义逻辑优先级。

通过结合这些符号,开发者能够构建功能强大、逻辑复杂的全文检索查询,满足各种复杂场景下的数据检索需求。在需要精确匹配、排除不相关词或调整关键词权重时,布尔模式是一种极为有用的选择。


也可以看看