特点
- Mysql 5.6之前版本,只有myisam支持全文索引,5.6之后,Innodb和myisam均支持全文索引
- ngram全文解析器,用来支持中文、日文、韩文分词
- 只有char、varchar、text类型字段能创建全文索引
- 英文分词用空格,逗号;中文分词用 ngram_token_size 设定
创建全文索引
-
创建表的时候创建
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 DEFAULT CHARSET=utf8mb4 COMMENT='文章表';
-
创建表之后创建
ALTER TABLE articles ADD FULLTEXT INDEX title_body_index (title,body) WITH PARSER ngram;
查询
-
不指定模式,默认使用自然语言模式
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('文言文');
-
指定模式
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('文言文' IN NATURAL LANGUAGE MODE); SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('文言文' IN BOOLEAN MODE);
相关参数
innodb_ft_min_token_size
- 默认3,表示最小3个字符作为一个关键词,增大该值可减少全文索引的大小
innodb_ft_max_token_size
- 默认84,表示最大84个字符作为一个关键词,限制该值可减少全文索引的大小
ngram_token_size
默认2,表示2个字符作为内置分词解析器的一个关键词,如对“abcd”建立全文索引,关键词为’ab’,‘bc’,‘cd’
当使用ngram分词解析器时,innodb_ft_min_token_size和innodb_ft_max_token_size无效
-
如何设置
在配置文件中修改,对于docker(本人安装的是mysql:5.7.33)安装的数据库,需要进入容器内,修改
/etc/mysql/mysql.conf.d
文件对于非docker安装的数据库,修改
/etc/my.cnf
。这都是在默认情况下的配置文件,具体到每个人,可能会不一样[mysqld] ngram_token_size = 1 innodb_ft_min_token_size = 1 innodb_ft_max_token_size = 84
这三个参数均不可动态修改,修改了这些参数,需重启MySQL服务,并重新建立全文索引!!
问题
查询数据不完整?如数据中明明存在
文言文
, 但是查询文言
的时候查询不到
解决方案
- 使用
boolean mode
通配符模式。如有单词calculate, 查询匹配为select * from articles where match(title,body) AGAINST('cal*' in boolean mode);
即可,如果用普通的自然语言模式+通配符则查询不到 - 调整
ngram_token_size
的大小至合适的长度
查询模式
ngram Parser Term Search
- 模式查询
- 在NATURAL LANGUAGE MODE检索模式下,查询关键字表达式被转换为若干个ngram词语的联合
- 字符串“管理开发”(假设ngram_token_size=2)会被转换为“管理 理开 开发”。给出多行记录,这多条记录都匹配检索词语“管理 理开 开发”,只要包含其中之一即可,匹配其一即可返回
- 在BOOLEAN MODE检索模式下,查询关键字表达式被转换为一个ngram短语检索
- 例如,字符串“项目中管理”(假设ngram_token_size=2)会被转换为“项目 目中 中管 管理”。给出多行记录,这多条记录都匹配检索词语“项目 目中 中管 管理”。但是只有包含 “项目中管理” 的记录行匹配检索短语 ‘“项目 目中 中管 管理”’,完全匹配才可返回
- 在NATURAL LANGUAGE MODE检索模式下,查询关键字表达式被转换为若干个ngram词语的联合
ngram Parser Wildcard Search
- 通配符查询
- 如果查询的通配符长度小于ngram token size
- 如果查询的通配符长度小于ngram token size, 查询返回所有索引的行,这些行包含以前缀术语开头的ngram token
- 如果查询的通配符长度大于ngram token size
- 该前缀词语会被转换为一个ngram短语,与此同时,通配符符号会被忽略。例如,假设ngram_token_size=2,“管理开发 *”通配符检索会被转换为“管理 开发”(“ngram Parser Term Search”的BOOLEAN MODE)
- 如果查询的通配符长度小于ngram token size
ngram Parser Phrase Search
- 短语查询
- 例如,检索短语“abc”会被转换为“ab bc”,包含“abc”和“ab bc”的记录都会被返回。检索短语“abc def”会被转换为“ab bc de ef”,包含“abcdef”的记录不会被返回
参考:
https://blog.csdn.net/u013887008/article/details/106757993
https://zhuanlan.zhihu.com/p/88275060