zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

mysql全文搜索sql命令的写法

mysql搜索SQL命令 写法 全文
2023-06-13 09:14:26 时间
mysql全文搜索,sql的写法:
MATCH(col1,col2,…)AGAINST(expr[INBOOLEANMODE|WITHQUERYEXPANSION])
比如:
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×7f){
$returnVal.=$str{$i+1}.$str{$i+2};
$i+=2;
}
$mbCount++;
}elseif($currOrd>0×7f){
$i+=2;
}
$mbStart++;
}
return$returnVal;
}//endfunctionSubString
//插入全文搜索分词表.一共两个,一个topic_ft,一个bbs_ft
$arrTopicIndex=&DV_ChineseWordSegment($topic);
if(!empty($arrTopicIndex)&&is_array($arrTopicIndex)){
$topicindex=$db->escape_string(implode("‘,$arrTopicIndex));
if($topicindex!==”){
$db->query(”UPDATE{$dv}topic_ftSETtopicindex="
{$topicindex}"WHEREtopicid="{$RootID}"”);
}else{
$db->query(”DELETEFROM{$dv}topic_ft
WHEREtopicid="{$RootID}"”);
}
}
}

这就是所谓的mysql全文搜索分词,mysql不会分词,而php会。就这么简单。
这虽然是一种比较过时的方法,但是非常实用。