MYSQL 全文本搜索FULLTEXT,Match,Against,布尔全文搜索

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;
    共39265条数据
  • 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);
    -

猜你喜欢

转载自blog.csdn.net/ging_ko/article/details/88425719