MATCH (
col1
,col2
,...) AGAINST (expr
[search_modifier
])
search_modifier:
{
IN NATURAL LANGUAGE MODE
| IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION
| IN BOOLEAN MODE
| WITH QUERY EXPANSION
}
MySQL 支持全文索引和搜索。
MySQL 中的全文索引是类型为
FULLTEXT
的索引。全文索引只能与
InnoDB
或MyISAM
表一起使用,并且只能为CHAR
、VARCHAR
或TEXT
列创建。MySQL 提供了一个内置的全文 ngram 解析器,它支持中文、日语和韩语 (CJK),以及一个可安装的 MeCab 全文解析器插件,用于日语。解析差异概述于 14.9.8 节,“ngram 全文解析器” 和 14.9.9 节,“MeCab 全文解析器插件”。
可以在创建表时,在
CREATE TABLE
语句中给出FULLTEXT
索引定义,也可以稍后使用ALTER TABLE
或CREATE INDEX
添加。对于大型数据集,将数据加载到没有
FULLTEXT
索引的表中,然后创建索引,比将数据加载到具有现有FULLTEXT
索引的表中要快得多。
全文搜索使用 MATCH() AGAINST()
语法执行。MATCH()
接受一个逗号分隔的列表,其中列出了要搜索的列。AGAINST
接受要搜索的字符串,以及一个可选的修饰符,该修饰符指示要执行的搜索类型。搜索字符串必须是在查询评估期间保持不变的字符串值。例如,这排除了表列,因为它对每一行都可能不同。
MySQL 不允许对 MATCH()
使用汇总列;更具体地说,任何匹配此处列出的所有条件的查询都会被拒绝,并返回 ER_FULLTEXT_WITH_ROLLUP
MATCH()
出现在查询块的SELECT
列表、GROUP BY
子句、HAVING
子句或ORDER BY
子句中。查询块包含
GROUP BY ... WITH ROLLUP
子句。对
MATCH()
函数的调用参数是分组列之一。
此类查询的一些示例如下所示
# 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');
允许在 WHERE
子句中将 MATCH()
与汇总列一起使用。
全文搜索有三种类型
自然语言搜索将搜索字符串解释为自然人类语言中的短语(自由文本中的短语)。除了双引号 (") 字符外,没有特殊运算符。停用词列表适用。有关停用词列表的更多信息,请参阅 14.9.4 节,“全文停用词”。
如果给出了
IN NATURAL LANGUAGE MODE
修饰符或没有给出修饰符,则全文搜索是自然语言搜索。有关更多信息,请参阅 14.9.1 节,“自然语言全文搜索”。布尔搜索使用特殊查询语言的规则解释搜索字符串。该字符串包含要搜索的词。它还可以包含指定要求的运算符,例如,匹配行中必须存在或不存在某个词,或者它的权重应该高于或低于通常情况。某些常见词(停用词)将从搜索索引中省略,如果出现在搜索字符串中,则不匹配。
IN BOOLEAN MODE
修饰符指定布尔搜索。有关更多信息,请参阅 14.9.2 节,“布尔全文搜索”。查询扩展搜索是对自然语言搜索的修改。搜索字符串用于执行自然语言搜索。然后,将搜索返回的最相关行中的词添加到搜索字符串中,并再次执行搜索。查询返回第二次搜索的行。
IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION
或WITH QUERY EXPANSION
修饰符指定查询扩展搜索。有关更多信息,请参阅 14.9.3 节,“带查询扩展的全文搜索”。
有关 FULLTEXT
查询性能的信息,请参阅 10.3.5 节,“列索引”。
有关 InnoDB
FULLTEXT
索引的更多信息,请参阅 17.6.2.4 节,“InnoDB 全文索引”。
全文搜索的限制条件列在第 14.9.5 节 “全文限制”中。
myisam_ftdump 实用程序转储 MyISAM
全文索引的内容。这可能有助于调试全文查询。请参阅第 6.6.3 节 “myisam_ftdump - 显示全文索引信息”。