diff --git a/mysql/mysql文档/mysql_索引.md b/mysql/mysql文档/mysql_索引.md index 722048c..b8ab4da 100644 --- a/mysql/mysql文档/mysql_索引.md +++ b/mysql/mysql文档/mysql_索引.md @@ -73,6 +73,10 @@ - [no operator](#no-operator) - [Proximity Search](#proximity-search) - [query expansion](#query-expansion) + - [ngram full-text parser](#ngram-full-text-parser) + - [配置`ngram_token_size`](#配置ngram_token_size) + - [使用ngram parser创建fulltext Index](#使用ngram-parser创建fulltext-index) + - [ngram parser space handling](#ngram-parser-space-handling) # innodb索引与算法 @@ -862,6 +866,70 @@ innodb支持全文检索的拓展查询。有时用户的查询关键词太短 由于query expansion全文检索可能带来非常多的非相关性查询结果,因此在使用时用户应该相当小心。 +### ngram full-text parser +mysql中内置的full-text parser使用空格作为word之间的分隔符,对部分语言如`中文,日文`并不适用。为了解决该限制,mysql提供了`ngram`full-text parser,其支持中文、日语、汉语。 + +> ngram full-text parser支持innodb和myisam存储引擎。 + +`ngram`代表给定文本中`n`个字符的连续序列,`ngram parser`会将一个文本`tokenize`为一系列连续的`n characters`序列。 + +> 例如,根据不同的`n`,通过gram parser,可以将字符串`abcd` tokenize为如下结果 +> ``` +> n=1 'a' 'b' 'c' 'd' +> n=2 'ab' ‘bc' 'cd' +> n=3 ‘abc' 'bcd' +> n=4 'abcd' +> ``` + +ngram parser是内置的server plugin,其会在server启动时自动加载。 + +#### 配置`ngram_token_size` +ngram parser默认的ngram token size1为2,例如,当ngram token size为2时,ngram parser将字符串`“abc def”`转化为4个token`"ab bc de ef"`。 + +`ngram_token_size`参数可用于配置ngram token size。其最小值为1,最大值为10. + +通常,ngram token size被设置为想要查找的最长token长度,当ngram token size越小时,将会产生更小的full-text search index,查询也会变得更快。 + +#### 使用ngram parser创建fulltext Index +如下示例显示了如何创建ngram parser对应的full-text index: +```sql +mysql> USE test; + +mysql> CREATE TABLE articles ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + title VARCHAR(200), + body TEXT, + FULLTEXT (title,body) WITH PARSER ngram + ) ENGINE=InnoDB CHARACTER SET utf8mb4; + +mysql> SET NAMES utf8mb4; + +INSERT INTO articles (title,body) VALUES + ('数据库管理','在本教程中我将向你展示如何管理数据库'), + ('数据库应用开发','学习开发数据库应用程序'); + +mysql> SET GLOBAL innodb_ft_aux_table="test/articles"; + +mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE ORDER BY doc_id, position; +``` +如果要向已经存在的表中添加`full-text index`且使用ngram parser,示例如下: +```sql +CREATE TABLE articles ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + title VARCHAR(200), + body TEXT + ) ENGINE=InnoDB CHARACTER SET utf8mb4; + +ALTER TABLE articles ADD FULLTEXT INDEX ft_index (title,body) WITH PARSER ngram; + +# Or: + +CREATE FULLTEXT INDEX ft_index ON articles (title,body) WITH PARSER ngram; +``` +#### ngram parser space handling +ngram parser在处理时消除空格,示例如下: +- `ab cd`会被转化为`ab`和`cd` +- `a bc`会被转化为`bc`