# 12.10 全文搜索功能
匹配 (*
col1*,*
col2*,...) 反对 (*
表达式* [*
搜索修饰符*])
search_modifier:
{
IN NATURAL LANGUAGE MODE
| IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION
| IN BOOLEAN MODE
| WITH QUERY EXPANSION
}
MySQL 支持全文索引和搜索:
MySQL 中的全文索引是一种类型的索引
全文
.MySQL 提供了一个内置的全文 ngram 解析器,它支持中文、日文和韩文 (CJK),以及一个可安装的日文 MeCab 全文解析器插件。解析差异在第 12.10.8 节,“ngram 全文解析器”, 和第 12.10.9 节,“MeCab 全文解析器插件”.
对于大型数据集,将数据加载到没有数据的表中要快得多
全文
索引,然后创建索引,而不是将数据加载到现有的表中全文
指数。全文搜索使用
匹配()对()
句法。匹配()
接受一个以逗号分隔的列表来命名要搜索的列。反对
接受一个要搜索的字符串和一个可选的修饰符,指示要执行的搜索类型。搜索字符串必须是在查询评估期间保持不变的字符串值。例如,这排除了表格列,因为每行可能不同。以前,MySQL 允许使用汇总列
匹配()
,但使用此构造的查询性能不佳且结果不可靠。(这是因为匹配()
不是作为其参数的函数,而是作为基表底层扫描中当前行的行 ID 的函数。)从 MySQL 8.0.28 开始,MySQL 不再允许此类查询;更具体地说,任何匹配此处列出的所有条件的查询都会被拒绝ER_FULLTEXT_WITH_ROLLUP
(opens new window):匹配()
出现在选择
列表,通过...分组
条款,拥有
条款,或订购方式
查询块的子句。查询块包含一个
GROUP BY ... 与汇总
条款。调用的参数
匹配()
函数是分组列之一。以下是此类查询的一些示例:
# MATCH() in SELECT list...
SELECT MATCH (a) AGAINST ('abc') FROM t GROUP BY a WITH ROLLUP;
SELECT 1 FROM t GROUP BY a, MATCH (a) AGAINST ('abc') WITH ROLLUP;
# ...in HAVING clause...
SELECT 1 FROM t GROUP BY a WITH ROLLUP HAVING MATCH (a) AGAINST ('abc');
# ...and in ORDER BY clause
SELECT 1 FROM t GROUP BY a WITH ROLLUP ORDER BY MATCH (a) AGAINST ('abc');
使用匹配()
在哪里
条款是允许的。
全文搜索有三种类型:
自然语言搜索将搜索字符串解释为自然人类语言中的短语(自由文本中的短语)。除双引号(“)字符外,没有特殊运算符。停止字列表适用。有关停止字列表的更多信息,请参阅第12.10.4节,“全文停止语”.
如果
在自然语言模式下
修改器已给出,或者如果未给出修改器。有关更多信息,请参阅第12.10.1节,“自然语言全文搜索”.布尔搜索使用特殊查询语言的规则解释搜索字符串。字符串包含要搜索的单词。它还可以包含一些操作符,这些操作符指定了一些要求,比如一个单词在匹配行中必须存在或不存在,或者它的权重应该高于或低于通常的值。某些常用词(stopwords)从搜索索引中省略,如果搜索字符串中存在,则不匹配。这个
在布尔模式下
修饰符指定布尔搜索。有关更多信息,请参阅第12.10.2节,“布尔全文搜索”.查询扩展搜索是对自然语言搜索的修改。搜索字符串用于执行自然语言搜索。然后,将搜索返回的最相关行中的单词添加到搜索字符串中,然后再次执行搜索。查询返回第二次搜索的行。这个
在具有查询扩展的自然语言模式下
或使用查询扩展
修饰符指定查询扩展搜索。有关更多信息,请参阅第12.10.3节,“带查询扩展的全文搜索”.有关
全文
查询性能,请参阅第8.3.5节,“列索引”.有关
InnoDB
全文
索引,参见第15.6.2.4节,“InnoDB全文索引”.中列出了全文搜索的限制条件第12.10.5节,“全文限制”.
这个存储引擎_ftdump实用程序转储
米萨姆
全文索引。这可能有助于调试全文查询。看见第4.6.3节,“myisam_ftdump-显示全文索引信息“.