`
androider
  • 浏览: 735613 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

mysql全文检索

阅读更多

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代码
  1. SELECT * FROM `category` WHERE MATCH(catname) AGAINST('phpjs')  

 

返回结果:

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

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

 

2、

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

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

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

 

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

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

SQL代码
  1. 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

分享到:
评论

相关推荐

    Mysql全文搜索match against的用法

    1.使用Mysql全文检索fulltext的先决条件 表的类型必须是MyISAM建立全文检索的字段类型必须是char,varchar,text2.建立全文检索先期配置由于Mysql的默认配置是索引的词的长度是4,所以要支持中文单字的话,首先更改这个...

    mysql实现全文检索

    mysql实现全文检索mysql实现全文检索mysql实现全文检索mysql实现全文检索mysql实现全文检索mysql实现全文检索mysql实现全文检索mysql实现全文检索

    mysql 全文搜索 技巧

    mysql 全文搜索 技巧

    如何在MySQL中提高全文搜索效率

    在此开发者只需要简单地标记出需要全文查找的字段,然后使用特殊的MySQL方法在那些字段运行搜索,这不仅仅提高了性能和效率,而且实现了更高质量的搜索,因为MySQL使用自然语言来智能地对结果评级,以去掉不相关的...

    MYSQL高性能全文检索介绍-E文版

    MYSQL高性能全文检索介绍-E文版。PDF文件。

    MySQL全文搜索[文].pdf

    MySQL全文搜索[文].pdf

    Solr3.6用DIH组件进行MySQL数据库全文索引部署包

    Solr3.6用DIH组件进行MySQL数据库全文索引部署包 完整的工程部署包 apache-solr-3.6.0.xml 放入apache-tomcat-7.0.27\conf\Catalina\localhost

    mysql 全文检索中文解决方法及实例代码

    主要介绍了mysql 全文检索中文解决方法及实例代码的相关资料,需要的朋友可以参考下

    mysql全文搜索 sql命令的写法

    mysql全文搜索,sql的写法: MATCH (col1,col2,…) AGAINST (expr [IN BOOLEAN MODE | WITH QUERY EXPANSION]) 比如: SELECT * FROM articles WHERE MATCH (title,body) AGAINST (‘database’); MATCH()函数对于一个...

    基于Sphinx+MySQL的千万级数据全文检索(搜索引擎)架构设计

    基于Sphinx+MySQL的千万级数据全文检索(搜索引擎)架构设计

    mysql内部函数

    微调MySQL全文搜索 Cast函数和操作符 其他函数 . 位函数 . 加密函数 . 信息函数 . 其他函数 与GROUP BY子句同时使用的函数和修改程序 . GROUP BY(聚合)函数 . GROUP BY修改程序 . 具有隐含字段的GROUP ...

    对设置 的关键字的全文检索,并且高亮显示

    对设置 的关键字的全文检索,并且高亮显示

    MySQL 5.1中文手冊

    微调MySQL全文搜索 12.8. Cast函数和操作符 12.9. 其他函数 12.9.1. 位函数 12.9.2. 加密函数 12.9.3. 信息函数 12.9.4. 其他函数 12.10. 与GROUP BY子句同时使用的函数和修改程序 12.10.1. GROUP BY(聚合)函数 ...

    mysql5.1中文手册

    目录 <br>前言 1. 一般信息 1.1. 关于本手册 1.2. 本手册采用的惯例 1.3. MySQL AB概述 1.4. MySQL数据库管理系统概述 1.4.1. MySQL的历史 1.4.2.... 全文搜索带查询扩展 12.7...

    MySQL中文搜索解决办法

    在 MySQL 下,在进行中文模糊检索时,经常会返回一些与之不相关的 记录,如查找 "%a%" 时,返回的可能有中文字符,却没有 a 字符存在。 本人以前也曾遇到过类似问题,经详细阅读 MySQL 的 Manual ,发现可以 有一...

    MySQL 5.1参考手册

    微调MySQL全文搜索 12.8. Cast函数和操作符 12.9. 其他函数 12.9.1. 位函数 12.9.2. 加密函数 12.9.3. 信息函数 12.9.4. 其他函数 12.10. 与GROUP BY子句同时使用的函数和修改程序 12.10.1. GROUP BY(聚合)函数 ...

    MySQL 5.1官方简体中文参考手册

    微调MySQL全文搜索 12.8. Cast函数和操作符 12.9. 其他函数 12.9.1. 位函数 12.9.2. 加密函数 12.9.3. 信息函数 12.9.4. 其他函数 12.10. 与GROUP BY子句同时使用的函数和修改程序 12.10.1. GROUP BY(聚合)函数 ...

Global site tag (gtag.js) - Google Analytics