- MySQL 可以使用 IN BOOLEAN MODE 修饰符执行布尔全文搜索。使用此修饰符,某些字符在搜索字符串中单词的开头或结尾具有特殊含义
- 布尔模式下的全文索引不会按照相关性递减的顺序自动对行进行排序。
- InnoDB 表需要 MATCH() 表达式的所有列上的 FULLTEXT 索引来执行布尔查询。即使没有 FULLTEXT 索引,针对 MyISAM 搜索索引的布尔查询也可以工作,尽管以这种方式执行的搜索会非常慢。
- 布尔模式可以包含指定要求的运算符,例如匹配行中必须存在或不存在单词,或者调整的权重的高低。某些常用词(停用词)从搜索索引中省略,如果出现在搜索字符串中则不匹配。
操作符 |
说明 |
+ |
前导或尾随加号表示该词必须出现在返回的每一行中。 InnoDB 仅支持前导加号。 |
- |
前导或尾随减号表示该词不得出现在返回的任何行中。 InnoDB 只支持前导减号。 - 运算符仅用于排除与其他搜索词匹配的行。因此,仅包含以 - 开头的术语的布尔模式搜索返回空结果。它不会返回“除包含任何排除项的行之外的所有行” |
无符号 |
默认情况下(当既未指定 + 也未指定 - 时),该词是可选的,但包含它的行的评级更高。这模拟了不带 IN BOOLEAN MODE 修饰符的 MATCH() AGAINST() 的行为。 |
@distance |
此运算符仅适用于 InnoDB 表。它测试两个或多个单词是否都在彼此之间指定的距离内开始,以单词为单位。在 @distance 运算符之前的双引号字符串中指定搜索词,例如 MATCH(col1) AGAINST('"word1 word2 word3" @8' IN BOOLEAN MODE) |
< 或 > |
这两个运算符用于更改单词对分配给行的相关值的贡献。 > 运算符增加贡献,< 运算符减少贡献。 |
( ) |
括号将单词分组为子表达式。括号内的组可以嵌套。 |
~ |
充当否定运算符,使单词对行相关性的贡献为负。
这对于标记“噪音”词很有用。包含这样一个词的行的评级低于其他行,但不会像使用 - 运算符那样被完全排除。 |
* |
用于截断(或通配符)运算符。
与其他运算符不同,它附加在要影响的单词后面。如果单词以 * 运算符之前的单词开头,则匹配。
如果指定了一个词,则它不会从布尔查询中删除,即使它太短或者是停用词。
通配符被视为必须出现在一个或多个单词开头的前缀。如果最小单词长度为4,则搜索“+word+the*”可能会比搜索“+word+the”返回更少的行,因为第二个查询会忽略太短的搜索项 |
" " |
包含在双引号(“)中的短语字符仅与键入时包含短语的行匹配。
全文引擎将短语拆分为单词,并在FULLTEXT索引中搜索单词。非单词字符不需要完全匹配:短语搜索只要求匹配项包含与短语完全相同的单词,并且顺序相同。例如,“test phrase”匹配“test, phrase”
如果短语不包含索引中的单词,则结果为空。这些单词可能不在索引中,这是由于多种因素的组合:如果它们不存在于文本中,或着是停止词,或者比索引单词的最小长度短。 |
示例
SELECT * FROM articles
WHERE MATCH (title,body) AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
运行结果如下:
+----+------------------------------+--------------------------------------------+
| id | title | body |
+----+------------------------------+--------------------------------------------+
| 1 | MySQL Tutorial | DBMS stands for DataBase ... |
| 2 | How To Use MySQL
Well | After you went through a ...
|
| 3 | Optimizing
MySQL | In this tutorial, we show ... |
| 4 | 1001 MySQL
Tricks | 1. Never run
mysqld as root. 2. ... |
| 6 | MySQL Security | When configured properly, MySQL ... |
+----+------------------------------+--------------------------------------------+
注
- InnoDB 全文搜索不支持在单个搜索词上使用多个运算符,如本例所示:'++apple'。在单个搜索词上使用多个运算符会向标准输出返回语法错误。 MyISAM 全文搜索成功地处理了相同的搜索,忽略了除与搜索词紧邻的运算符之外的所有运算符。
- InnoDB 全文搜索仅支持前导加号或减号。例如,InnoDB 支持'+apple'但不支持'apple+'。指定尾随加号或减号会导致 InnoDB 报告语法错误。
- InnoDB 全文搜索不支持使用带通配符的前导加号('+*')、加号和减号组合('+-')或前导加号和减号组合('+-apple ').这些无效查询返回语法错误。
- InnoDB 全文搜索不支持在布尔全文搜索中使用 @ 符号。 @ 符号保留供@distance 邻近搜索运算符使用。
- 他们不使用适用于 MyISAM 搜索索引的 50% 阈值
来自 <https://dev.mysql.com/doc/refman/8.0/en/fulltext-boolean.html>