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);