mysql全文检索
以base_person为例,基于InnoDB
1 | CREATE TABLE `base_person` ( |
创建/删除
- 创建
创建表的同时创建全文索引
1 | CREATE TABLE `base_person` ( |
通过alter方式
1 | alter table base_person add fulltext index ft_base_person (address,domicile,name,phone) WITH PARSER ngram; |
通过create方式
1 | create fulltext index ft_base_person on base_person (address,domicile,name,phone) with parser ngram; |
- 删除
通过alter方式
1 | alter table base_person drop index ft_base_person; |
通过drop方式
1 | drop index ft_base_person on base_person; |
使用
- 自然语言
查出含有黑龙江和138577的记录,默认已排序
1 | SELECT address,domicile,name,phone FROM base_person where match(address,domicile,name,phone) against('黑龙江 138577'); |
展示关联分值
1 | SELECT address,domicile,name,phone,match(address,domicile,name,phone) against('黑龙江 138577') as score FROM base_person; |
查出含有黑龙江和138577的记录和分值,并排序
1 | SELECT address,domicile,name,phone,match(address,domicile,name,phone) against('黑龙江 138577') as score FROM base_person where match(address,domicile,name,phone) against('黑龙江 138577') |
- BOOLEAN模式
TODO
- explain模式
TODO
注意点
https://dev.mysql.com/doc/refman/5.7/en/fulltext-restrictions.html
优化
如果需要搜索单字,就要把ngram_token_size设置为1
通过mysqld
1 | mysqld --ngram_token_size=1 |
通过my.cnf
1 | [mysqld] |
须重建索引