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
的索引。 -
MySQL 提供了一个内置的全文 ngram 解析器,支持中文、日文和韩文(CJK),以及一个可安装的 MeCab 全文解析器插件用于日文。解析差异在 第 14.9.8 节,“ngram 全文解析器” 和 第 14.9.9 节,“MeCab 全文解析器插件” 中进行了概述。
-
一个
FULLTEXT
索引定义可以在 CREATE TABLE 语句中创建表时给出,也可以使用 ALTER TABLE 或 CREATE INDEX 添加。 -
对于大型数据集,将数据加载到没有
FULLTEXT
索引的表中,然后创建索引比加载数据到已经存在FULLTEXT
索引的表中要快得多。
全文搜索使用 MATCH() AGAINST()
语法。MATCH()
接受一个逗号分隔的列名列表,以便搜索。AGAINST
接受一个要搜索的字符串和一个可选的修饰符,指示要执行什么类型的搜索。搜索字符串必须是一个在查询评估期间保持不变的字符串值。这排除了例如表列,因为它可以在每行中不同。
MySQL 不允许在 MATCH()
中使用 rollup 列;更具体地说,任何满足以下所有条件的查询都会被拒绝,错误代码为 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()
与 rollup 列是允许的。
有三种类型的全文搜索:
-
自然语言搜索将搜索字符串解释为自然人类语言(自由文本短语)。没有特殊操作符,除了双引号(")字符。停用词列表适用。有关停用词列表的更多信息,请参阅 第 14.9.4 节,“Full-Text Stopwords”。
如果给定
IN NATURAL LANGUAGE MODE
修饰符或不给定修饰符,则全文搜索为自然语言搜索。有关更多信息,请参阅 第 14.9.1 节,“Natural Language Full-Text Searches”。 -
布尔搜索将搜索字符串解释为特殊查询语言的规则。字符串包含要搜索的单词。它也可以包含操作符,以指定要求单词必须出现在匹配行中或不出现在匹配行中,或者它应该被赋予更高或更低的权重。某些常见单词(停用词)被省略了搜索索引,并且如果出现在搜索字符串中,不会匹配。
IN BOOLEAN MODE
修饰符指定布尔搜索。有关更多信息,请参阅 第 14.9.2 节,“Boolean Full-Text Searches”。 -
查询扩展搜索是自然语言搜索的修改。搜索字符串用于执行自然语言搜索。然后,从搜索返回的最相关行中添加单词到搜索字符串,并再次执行搜索。查询返回第二次搜索的行。
IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION
或WITH QUERY EXPANSION
修饰符指定查询扩展搜索。有关更多信息,请参阅 第 14.9.3 节,“Full-Text Searches with Query Expansion”。
有关 FULLTEXT
查询性能的信息,请参阅 第 10.3.5 节,“Column Indexes”。
有关 InnoDB
FULLTEXT
索引的更多信息,请参阅 第 17.6.2.4 节,“InnoDB Full-Text Indexes”。
全文搜索的限制列在 第 14.9.5 节,“Full-Text Restrictions” 中。
myisam_ftdump 实用程序转储 MyISAM
全文索引的内容。这可能有助于调试全文查询。请参阅 第 6.6.3 节,“myisam_ftdump — Display Full-Text Index information”。