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。
【实例】 MySQL 9.0 的全文检索。创建数据表,并设置全文检索,SQL 语句如下:
插入演示数据,SQL 语句如下:
普通检索必须使用整个词才能检索到,SQL 语句如下:
只有部分词是不能检索出信息的,SQL 语句如下:
新的全文检索功能可以检索任意两个组合的记录,SQL 语句如下:
再次使用全文检索功能检索任意两个组合的记录,SQL 语句如下:
MySQL 9.0 的全文检索功能为用户提供了高效的文本搜索能力,特别适合需要对大规模文本数据进行快速查询的场景。通过创建全文索引并使用 MATCH ... AGAINST 语法,用户可以实现自然语言处理、布尔搜索以及查询扩展等多种搜索模式,从而满足不同的搜索需求。
另外,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 语法,用户可以实现自然语言处理、布尔搜索以及查询扩展等多种搜索模式,从而满足不同的搜索需求。