设为首页 收藏本站
查看: 1272|回复: 0

[经验分享] mysql全文检索

[复制链接]

尚未签到

发表于 2016-9-11 06:00:12 | 显示全部楼层 |阅读模式
  mysql到版本3.23.23时,开始支持全文检索,通过语句SELECT ... FROM ... MATCH(...) AGAINST(...) 来在整个表中检索是否有匹配的,全文索引是一个定义为fulltext的类型索引,应用在myisam表中。值得一提的是对于一个大的数据库来说,把数据装载到一个没有fulltext索引的表中,然后再添加索引,这样速度会非常快,但是把数据装载到一个已经有fulltext索引的表中,这样速度非常慢的。
  
  首页要先明白mysql的全文检索原理:mysql使用的是一个非常简单的剖析器来将文本分隔成词,空格、标点等,比如‘welcom to you’将分隔为三个词‘welcom’、‘to’、‘you’,但是对中文来说,比如‘人力方网站正式上线’,这将无法分隔,因此目前mysql只支持英文的全文检索。
  
  下面我们通过实例来一步步把全文检索的过程解释清楚:
  首页我们建立表与初始化数据

CREATE TABLE IF NOT EXISTS `category` (   
`id` int(10) NOT NULL auto_increment,   
`fid` int(10) NOT NULL,   
`catname` char(255) NOT NULL,   
`addtime` char(10) NOT NULL,   
PRIMARY KEY  (`id`),   
FULLTEXT KEY `catname` (`catname`)   
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;   

INSERT INTO `category` (`id`, `fid`, `catname`, `addtime`) VALUES   
(1, 0, 'welcome to you!', '1263363380'),   
(2, 0, 'hello phpjs,you are welcome', '1263363416'),   
(3, 0, 'this is the fan site of you', '1263363673');   


 


  在具体实例之前,我们分析下msyql全文检索的语法:函数 MATCH() 对照一个文本集(包含在一个 FULLTEXT 索引中的一个或多个列的列集)执行一个自然语言搜索一个字符串。搜索字符串做为 AGAINST() 的参数被给定。搜索以忽略字母大小写的方式执行。说白了就是MATCH给定匹配的列(fulltext类型索引),AGAINST给定要匹配的字符串,多个用空格、标点分开,mysql会自动分隔。
  1、

SQL代码



  • SELECT * FROM `category` WHERE MATCH(catname) AGAINST('phpjs')  


  
  返回结果:
  id  fid  catname                                addtime  
2   0    hello phpjs,you are welcome 1263363416
  匹配出了含有phpjs关键字的行数据。
  
  2、

SQL代码



  • SELECT * FROM `category` WHERE MATCH (catname) AGAINST ('this')   


  
  按照上面的思路,第三行数据含有this,因此应该可以匹配出第三行数据的,但事实却奇怪得很,返回结果为空,为什么呢?
  原来是mysql指定了最小字符长度,默认是4,必须要匹配大于4的才会有返回结果,可以用SHOW VARIABLES LIKE 'ft_min_word_len' 来查看指定的字符长度,也可以在mysql配置文件my.ini 更改最小字符长度,方法是在my.ini 增加一行 比如:ft_min_word_len = 2,改完后重启mysql即可。
  
  3、这里我们要确定把最小字符改为2了,因为3行记录都有‘you’,因此心想,匹配‘you’就可以返回所有结果了

SQL代码



  • SELECT * FROM `category` WHERE MATCH (catname) AGAINST ('you')   



 
  返回结果还是为空,大跌眼镜了吧,这又是为什么呢?
  原来mysql在集和查询中的对每个合适的词都会先计算它们的权重,一个出现在多个文档中的词将有较低的权重(可能甚至有一个零权重),因为在这个特定的集中,它有较低的语义值。否则,如果词是较少的,它将得到一个较高的权重,mysql默认的阀值是50%,上面‘you’在每个文档都出现,因此是100%,只有低于50%的才会出现在结果集中。
  
  4、有人会想,我不去管权重大小,只要有匹配的就给我返回结果集中,那么该如何做呢?
  mysql到 4.0.1 时,可以使用 IN BOOLEAN MODE 修饰语来执行一个逻辑全文搜索

SQL代码



  • SELECT * FROM `category` WHERE MATCH(catname) AGAINST('you' IN BOOLEAN MODE)  


  
  
  总结:1、要注意最小字符的长度;
  2、要注意关键词的权重;
  
  ps,一些学习资料:
  http://www.111cn.net/database/110/FULLTEXT-mysql.htm
  
  http://onlamp.com/pub/a/onlamp/2003/06/26/fulltext.html
  
  http://dev.mysql.com/doc/refman/5.1/zh/functions.html#fulltext-query-expansion

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-270439-1-1.html 上篇帖子: MySQL Handling Duplicates 下篇帖子: Mysql相关知识
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表