mysql全文检索的例子_mysql全文检索原理与实例分析

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

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

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

Sql代码

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、

Php代码

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

返回结果:

id  fid  catname                                addtime

2   0    hello phpjs,you are welcome 1263363416

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

2、

Php代码

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

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

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

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

Php代码

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

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

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

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

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

Php代码

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

总结:1、要注意最小字符的长度;

2、要注意关键词的权重;

中文全文检索解决方案

前面我们已经知道了mysql全文检索的原理以及分词技巧,同时也知道mysql全文检索只支持英文,那么中文该如何来检索呢?

其基本思路是把中文转换为英文,这里要用到两个表,一个是原始内容表,一个是原始内容转换为英文后的表(也叫索引表),它的搜索过程是这样的:先对 用户输入的信息进行分词,然后把这些词转换为英文,这样就可以利用mysql的全文检索对检索表进行匹配,得出id再从原始内容表查询。

下面来说下两种mysql中文检索的方案:

分别建一个内容表、一个内容索引表

Sql代码

CREATE TABLE IF NOT EXISTS `news` (

`id` int(8) NOT NULL auto_increment,

`content` varchar(100) default NULL,

PRIMARY KEY  (`id`),

) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;

Sql代码

CREATE TABLE IF NOT EXISTS `news_index` (

`id` int(8) NOT NULL auto_increment,

`nid` int(8) NOT NULL,

`key` text,

PRIMARY KEY  (`id`)

) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

1、将中文转换为base64编码

Php代码

$data = '我要坚持学php';

$data = base64_encode($data); //返回的结果就是编码后的字符串,这里省略了分词这个步骤

但是这种方式有个缺点,当用户搜索拼音的时候检索不出结果;

2、将中文转换为拼音

网上有很多将中文转换为拼音的源码,看附件,之后参照上面的步骤把中文转换为拼音就行了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值