mysql全文检索

摘要:
首页要先明白mysql的全文检索原理:mysql使用的是一个非常简单的剖析器来将文本分隔成词,空格、标点等,比如‘welcomtoyou’将分隔为三个词‘welcom’、‘to’、‘you’,但是对中文来说,比如‘人力方网站正式上线’,这将无法分隔,因此目前mysql只支持英文的全文检索。否则,如果词是较少的,它将得到一个较高的权重,mysql默认的阀值是50%,上面‘you’在每个文档都出现,因此是100%,只有低于50%的才会出现在结果集中。

mysql到版本3.23.23时,开始支持全文检索,通过语句SELECT ... FROM ... MATCH(...) AGAINST(...) 来在整个表中检索是否有匹配的,全文索引是一个定义为fulltext的类型索引,应用在myisam表中。值得一提的是对于一个大的数据库来说,把数据装载到一个没有fulltext索引的表中,然后再添加索引,这样速度会非常快,但是把数据装载到一个已经有fulltext索引的表中,这样速度非常慢的。

首页要先明白mysql的全文检索原理:mysql使用的是一个非常简单的剖析器来将文本分隔成词,空格、标点等,比如‘welcom to you’将分隔为三个词‘welcom’、‘to’、‘you’,但是对中文来说,比如‘人力方网站正式上线’,这将无法分隔,因此目前mysql只支持英文的全文检索。

下面我们通过实例来一步步把全文检索的过程解释清楚:

首页我们建立表与初始化数据

Sql代码mysql全文检索第1张
  1. CREATETABLEIF NOTEXISTS `category` (
  2. `id` int(10) NOTNULLauto_increment,
  3. `fid` int(10) NOTNULL,
  4. `catname` char(255) NOTNULL,
  5. `addtime` char(10) NOTNULL,
  6. PRIMARYKEY(`id`),
  7. FULLTEXT KEY`catname` (`catname`)
  8. ) ENGINE=MyISAM DEFAULTCHARSET=utf8 AUTO_INCREMENT=5 ;
  9. INSERTINTO`category` (`id`, `fid`, `catname`, `addtime`) VALUES
  10. (1, 0, 'welcome to you!', '1263363380'),
  11. (2, 0, 'hello phpjs,you are welcome', '1263363416'),
  12. (3, 0, 'this is the fan site of you', '1263363673');
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代码
  1. SELECT* FROM`category` WHEREMATCH(catname) AGAINST('phpjs')

返回结果:

id fid catname addtime 2 0 hello phpjs,you are welcome 1263363416

匹配出了含有phpjs关键字的行数据。

2、

SQL代码
  1. SELECT* FROM`category` WHEREMATCH (catname) AGAINST ('this')

按照上面的思路,第三行数据含有this,因此应该可以匹配出第三行数据的,但事实却奇怪得很,返回结果为空,为什么呢?

原来是mysql指定了最小字符长度,默认是4,必须要匹配大于4的才会有返回结果,可以用SHOWVARIABLESLIKE'ft_min_word_len' 来查看指定的字符长度,也可以在mysql配置文件my.ini 更改最小字符长度,方法是在my.ini 增加一行 比如:ft_min_word_len = 2,改完后重启mysql即可。

3、这里我们要确定把最小字符改为2了,因为3行记录都有‘you’,因此心想,匹配‘you’就可以返回所有结果了

SQL代码
  1. SELECT* FROM`category` WHEREMATCH (catname) AGAINST ('you')

返回结果还是为空,大跌眼镜了吧,这又是为什么呢?

原来mysql在集和查询中的对每个合适的词都会先计算它们的权重,一个出现在多个文档中的词将有较低的权重(可能甚至有一个零权重),因为在这个特定的集中,它有较低的语义值。否则,如果词是较少的,它将得到一个较高的权重,mysql默认的阀值是50%,上面‘you’在每个文档都出现,因此是100%,只有低于50%的才会出现在结果集中。

4、有人会想,我不去管权重大小,只要有匹配的就给我返回结果集中,那么该如何做呢?

mysql到 4.0.1 时,可以使用 IN BOOLEAN MODE 修饰语来执行一个逻辑全文搜索

SQL代码
  1. SELECT* FROM`category` WHEREMATCH(catname) AGAINST('you'INBOOLEAN 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

转载:http://androider.iteye.com/blog/643486

免责声明:文章转载自《mysql全文检索》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇文件的上传&预览&下载学习(一)IO口下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MySQL中, 如何查询某一天, 某一月, 某一年的数据.

今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) <= 1 近7天 SELECT * FROM 表名 where DATE_SUB(CURDATE(), IN...

Mac for MySQL 5.7 安装教程

一、环境 MAC OS X 10.10 二、下载MySQL 地址:http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.10-osx10.10-x86_64.dmg 三、双击安装 安装过程中需要注意的是,MySQL已经默认用户root的密码已经不再是root,而是动态生成的一个临时密码(如:root...

Linux 平台MySQL启动关闭方式总结

  MySQL的启动方法有很多种,下面对比、总结这几种方法的一些差异和特性,下面实验的版本为MySQL 5.6。如有疏漏或不足,敬请指点一二。   1:使用mysqld启动、关闭MySQL服务      mysqld是MySQL的守护进程,我们可以用mysqld来启动、关闭MySQL服务,关于mysqld, MySQL 5.6官方介绍资料如下所示:...

mysql主从之主键冲突

收到短信报警,两台数据库都报slave同步失败了,先说明一下环境,架构:lvs+keepalived+amoeba+mysql,主主复制,单台写入, 主1:192.168.0.223(写) 主2:192.168.0.230 好吧,先show slave status G看一下同步失败的具体报错吧 登录主2库查看: mysql> show slave...

模型融合

结合/融合/整合 (integration/ combination/ fusion)多个机器学习模型往往可以提高整体的预测能力。这是一种非常有效的提升手段,在多分类器系统(multi-classifier system)和集成学习(ensemble learning)中,融合都是最重要的一个步骤。 举个实用的例子,Kaggle比赛中常用的stacking...

Mysql导出逗号分隔的csv文件

     CleverCode在实际的工作中。常常须要将一些报表。或者日志数据等导出来,假设直接做页面,假设次数也不是非常多,需求也不同。所以直接导出csv文件,更加直观。 1 导出csv文件1.1 语句格式      SELECT [列名] FROM table [WHERE 语句] [order by 语句] [limit 语句]      INTO...