仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 821|回复: 8
打印 上一主题 下一主题

[学习教程] MYSQL网页编程之mysql全文搜刮:sql的写法

[复制链接]
因胸联盟 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:16:29 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
而且其固有的弹性使得它易于扩展以处理不断增长的需求,或当需求MySQL学习教程减弱时缩减规模。</p>起首,人人先往下载一份dvbbs.phpbeta1的代码,解压后先抛开php代码,找出你的mysql手册,假如没有手册那末就间接看上面的实例操纵吧!
mysql全文搜刮,sql的写法:
MATCH(col1,col2,…)AGAINST(expr[INBOOLEANMODEWITHQUERYEXPANSION])
好比:
SELECT*FROMarticlesWHEREMATCH(title,body)AGAINST(’database’);
MATCH()函数关于一个字符串实行材料库内的天然言语搜刮。一个材料库就是1套1个或2个包括在FULLTEXT内的列。搜刮字符串作为对AGAINST()的参数而被给定。关于表中的每行,MATCH()前往一个相干值,即,搜刮字符串和MATCH()表中指定列中该行笔墨之间的一个类似性器度。
上面的例子则加倍庞大。扣问前往相干值,同时对行依照相干性渐弱的按次举行排序。为完成这个了局,你应当两次指定MATCH():一次在SELECT列表中而另外一次在WHERE子句中。这不会引发分外的外务操纵,缘故原由是MySQL优化程序注重到两个MATCH()挪用是不异的,从而只会激活一次全文搜刮代码。
以下为援用的内容:
mysql>SELECTid,body,MATCH
(title,body)AGAINST
->(’Securityimplicationsof
runningMySQLasroot’)ASscore
->FROMarticlesWHEREMATCH
(title,body)AGAINST
->(’Securityimplicationsof
runningMySQLasroot’);

以是,到这里你应当会mysql英文全文搜刮了.
请注重一个成绩.
一些词在全文搜刮中会被疏忽:
*任何过于短的词城市被疏忽。全文搜刮所能找到的词的默许最小长度为4个字符。
*中断字中的词会被疏忽。
mysql还自带查询扩大功效.这里不做过量会商.
上面举行php中文全文搜刮的剖析
已经有一个版本的mysql撑持中文全文搜刮(海量mysqlchinese+,说是GPL可是终极没有开源)
中文全文搜刮的关头是在分词上.mysql自己不撑持cjk的分词(cjk:chinese,japanese,korean),
以是
!!!!****怎样用php摹拟分词是mysql全文索引的关头****!!!!
中文分词是言语分词中最坚苦的.如今也没有人可以完全完善的办理(固然这些搜刮引擎做的都还不错.)
以下为援用的内容:
//fcicq:上面给人人看看这里php的分词是怎样做的.
function&DV_ChineseWordSegment($str,$encodingName=’gbk’){
static$objEnc=null;
if($objEnc===null){
if(!class_exists(’DV_Encoding’)){
require_onceROOT_PATH.’inc/DV_Encoding.class.php’;
}
$objEnc=&DV_Encoding::GetEncoding($encodingName);
}
$strLen=$objEnc->StrLength($str);
$returnVal=array();
if($strLen<=1){
return$str;
}
$arrStopWords=&DV_GetStopWordList();
//print_r($arrStopWords);
//过滤一切HTML标签
$str=preg_replace(#<[a-zA-Z]+?.*?>#is’,”,$str);
//过滤一切stopword
$str=str_replace($arrStopWords[’StrRepl’],’‘,$str);
$str=preg_replace($arrStopWords[’PregRepl’],’‘,$str);
//echo“$str:{$str}
“;
$arr=explode(’‘,$str);
//fcicq:好了,这上面的才是php分词关头*************
foreach($arras$tmpStr){
if(preg_match(”/^[x00-x7f]+$/i”,$tmpStr)===1)
{//fcicq:满是E文,不妨,mysql能够熟悉的
$returnVal[]=‘‘.$tmpStr;
}else{//fcicq:中英夹杂…
preg_match_all(”/([a-zA-Z]+)/i”,$tmpStr,$matches);
if(!empty($matches)){//fcicq:英语部分
foreach($matches[0]as$matche){
$returnVal[]=$matche;
}
}
//过滤ASCII字符
$tmpStr=preg_replace(”/([x00-x7f]+)/i”,”
,$tmpStr);//fcicq:你看,剩下的不就满是中文了?
$strLen=$objEnc->StrLength($tmpStr)-1;
for($i=0;$i<$strLen;$i++){
$returnVal[]=$objEnc->SubString($tmpStr,$i,2)
;//fcicq:注重这里的substr,不是手册上的.
//fcicq:你细心看,一切的词都是分红两个.
//好比”数据库的使用”,会被分红数据据库库的的应使用…
//全文搜刮:全文文搜搜刮
//这分词天然是不怎样的
//可是,搜刮的时分一样这么做.
//好比搜刮数据库,就相称于搜刮了数据据库.
//这是一种相称传统的全文搜刮分词办法.
}
}
}
return$returnVal;
}//endfunctionDV_ChineseWordSegment
//fcicq:这就是传说中的substr.偶信任很多人写出来的php代码都比这个好.
function&SubString(&$str,$start,$length=null){
if(!is_numeric($start)){
returnfalse;
}
$strLen=strlen($str);
if($strLen<=0){
returnfalse;
}
if($start<0$length<0){
$mbStrLen=$this->StrLength($str);
}else{
$mbStrLen=$strLen;
}
if(!is_numeric($length)){
$length=$mbStrLen;
}elseif($length<0){
$length=$mbStrLen+$length-1;
}
if($start<0){
$start=$mbStrLen+$start;
}
$returnVal=;
$mbStart=0;
$mbCount=0;
for($i=0;$i<$strLen;$i++){
if($mbCount>=$length){
break;
}
$currOrd=ord($str{$i});
if($mbStart>=$start){
$returnVal.=$str{$i};
if($currOrd>0
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-6-11 07:34

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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