首页 > 编程笔记 > MySQL笔记 阅读:4

MySQL中的全文索引(附带实例)

MySQL 9.0 支持更灵活和更加优化的全文检索。例如,全文索引支持外部的分析器,就像 MyISAM;插件可以替代内置分析器,也可以作为一个前端来使用。

另外,MySQL 9.0 实现了标记优化器,这个优化器可以将查询结果传递到 InnoDB,因此 InnoDB 可以跳过全文检索部分。

在 InnoDB 上实现了支持 CJK(中文、日文和韩文)的全文检索。MySQL 9.0 为 CJK 提供了一个默认的全文分析器(n-gram 分析器)。

在全文索引中,n-gram 就是一段文字里面连续的 n 个字的序列。例如,用 n-gram 来对“春花秋月”进行分词,得到的结果如下表所示。其中 n 由参数 ngram_token_size 控制,表示分词的大小,默认是 2。

表:“春花秋月”的分词
n 的值 分词结果
1 n-1:"春","花","秋","月"
2 n=2:"春花","花秋","秋月"
3 n=3:"春花秋","花秋月"
4 n=4:"春花秋月"

【实例】 MySQL 9.0 的全文检索。创建数据表,并设置全文检索,SQL 语句如下:
mysql>CREATE TABLE tft (
        id int(11) DEFAULT NULL,
        name varchar(512) DEFAULT NULL,
        content text,
        FULLTEXT KEY idx_name(name),
        FULLTEXT KEY idx_content(content) WITH PARSER ngram)

插入演示数据,SQL 语句如下:
mysql> INSERT INTO tft (id,name,content) VALUES (1,'春花秋月','经典古诗');
Query OK, 1 row affected (0.00 sec)

普通检索必须使用整个词才能检索到,SQL 语句如下:
mysql> SELECT * FROM tft WHERE MATCH (name) AGAINST ('春花秋月');
+------+----------+----------+
| id   | name    | content   |
+------+----------+----------+
|   1  | 春花秋月 | 经典古诗 |
+------+----------+----------+

只有部分词是不能检索出信息的,SQL 语句如下:
mysql>SELECT * FROM tft WHERE MATCH (name) AGAINST ('秋月');
Empty set (0.00 sec)

新的全文检索功能可以检索任意两个组合的记录,SQL 语句如下:
mysql> SELECT * FROM tft WHERE MATCH (content) AGAINST ('古诗');
+------+----------+----------+
| id   | name     | content  |
+------+----------+----------+
|   1  | 春花秋月 | 经典古诗 |
+------+----------+----------+

再次使用全文检索功能检索任意两个组合的记录,SQL 语句如下:
mysql> SELECT * FROM tft WHERE MATCH (content) AGAINST ('典古');
+------+----------+----------+
| id   | name     | content  |
+------+----------+----------+
|   1  | 春花秋月 | 经典古诗 |
+------+----------+----------+

MySQL 9.0 的全文检索功能为用户提供了高效的文本搜索能力,特别适合需要对大规模文本数据进行快速查询的场景。通过创建全文索引并使用 MATCH ... AGAINST 语法,用户可以实现自然语言处理、布尔搜索以及查询扩展等多种搜索模式,从而满足不同的搜索需求。

相关文章