1、mysql的引擎中MYISAM支持全文本搜索,而InnoDB【5.6版本开始支持】不支持文本搜索。
2、为了进行全文本搜索,必须索引被搜索的列,而且要随着数据的改变不断地重新索引。
一般在创建表时启用全文本搜索。 CREATE TABLE 语句接受 FULLTEXT 子句,它给出被索引列的一个逗号分隔的列表。
在定义之后,MySQL自动维护该索引。在增加、更新或删除行时,索引随之自动更新。
3、在索引之后,使用两个函数 Match() 和 Against() 执行全文本搜索,其中 Match() 指定被搜索的列, Against() 指定要使用的搜索表达式。
4、全文本布尔操作符
| 操作符 | 描述 |
|---|---|
| + | 包含,词必须存在 |
| - | 排除,词必须不出现 |
| > | 包含,而且增加等级值 |
| < | 包含,且减少等级值 |
| () | 把词组成子表达式(允许这些子表达式作为一个组被包含、排除、排列等) |
| ~ | 取消一个词的排序值 |
| * | 词尾的通配符 |
| “” | 定义一个短语(与单个词的列表不一样,它匹配整个短语以便包含或排除这个短语) |
5、创建表案例
CREATE TABLE `good` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
`name` varchar(128) NOT NULL COMMENT '商品名称',
`price` int(20) NOT NULL COMMENT '单价(单位:分)',
`content` text NOT NULL COMMENT '内容',
`create_time` datetime NOT NULL COMMENT '添加时间',
PRIMARY KEY (`id`),
FULLTEXT (`name`,`content`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
6、无索引时添加FULLTEXT 索引
ALTER TABLE `good` ADD FULLTEXT INDEX `name` (`name`, `content`) WITH PARSER ngram;
7、查询扩展实例
/*测试后发现速度很慢*/
SELECT * FROM good WHERE Match(name,content) AGAINST('欧式 中式' WITH QUERY EXPANSION);
8、布尔文本搜索
即使没有 FULLTEXT 索引也可以使用,但效率非常低下
关键字 IN BOOLEAN MODE
SELECT * FROM good WHERE Match(name,content) AGAINST('+欧式 中式' IN BOOLEAN MODE);
注意 MATCH (name,content) 里面的值必须是前面建立全文索引的两个字段不能少
9、mysql 默认支持全文检索的字符长度是4,可以用SHOW VARIABLES LIKE ‘ft_min_word_len’ 来查看指定的字符长度,也可以在mysql配置文件my.ini 更改最小字符长度,方法是在my.ini 增加一行 比如:ft_min_word_len = 2,改完后重启mysql即可。
单个汉字搜索失败,如有知道的麻烦告诉下,谢谢
10、测试性能(ALTER TABLE good ADD FULLTEXT INDEX name (name) WITH PARSER ngram;)
- select id,name from good;

- SELECT id,name from good where name like ‘%欧式%’;

- SELECT id,name from good where MATCH(name) AGAINST(‘欧式’ WITH QUERY EXPANSION);

- SELECT id,name from good where MATCH(name) AGAINST(‘欧式’ IN BOOLEAN MODE);






