MySQL数据库对dvbbs.php全文搜索的完好解析[MySQL防范]
本文“MySQL数据库对dvbbs.php全文搜索的完好解析[MySQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
首先,大家先去下载一份dvbbs.php beta1的代码,解压后先抛开php代码,找出你的mysql手册,假如没有手册那么就直接看下面的实例操作吧!
mysql全文搜索,sql的写法:
MATCH (col1,col2,…) AGAINST (expr [IN BOOLEAN MODE | WITH QUERY EXPANSION])
比方:
SELECT * FROM articles WHERE MATCH (title,body) AGAINST (’database’);
MATCH()函数关于一个字符串履行资料库内的自然语言搜索.一个资料库就是1套1个或2个包含在FULLTEXT内的列.搜索字符串作为对 AGAINST()的参数而被给定.关于表中的每一行, MATCH() 返回一个相关值,即, 搜索字符串和 MATCH()表中指定列中该行文字之间的一个类似性器量.
下面的例子则越发复杂.询问返回相关值,同时对行按照相关性渐弱的次序举行排序.为实现这个后果,你应当两次指定 MATCH(): 一次在 SELECT 列表中而另一次在 WHERE子句中.这不会惹起额外的内务操作,缘由是MySQL 优化程序注意到两个MATCH()调用是相同的,从而只会激活一次全文搜索代码.
以下为引用的内容: mysql> SELECT id, body, MATCH |
所以,到这里你应当会mysql 英文全文搜索了.
请注意一个问题.
一些词在全文搜索中会被忽视:
* 任何过于短的词城市被忽视. 全文搜索所能找到的词的默许最小长度为 4个字符.
* 终止字中的词会被忽视.
mysql还自带查询扩大功效.这里不做过量谈论.
下面举行php中文全文搜索的解析
曾经有一个版本的mysql支持中文全文搜索(海量 mysql chinese+,说是GPL但是终究没有开源)
中文全文搜索的关键是在分词上.mysql本身不支持cjk的分词(cjk:chinese,japanese,korean),
所以
!!!!****若何用php模拟分词是mysql全文索引的关键****!!!!
中文分词是语言分词中最艰难的.目前也没有人可以完好完善的办理(固然这些搜索引擎做的都还不错.)
以下为引用的内容: //fcicq:下面给大家看看这里php的分词是怎么做的. static $objEnc = null; if( $objEnc === null ){ if( !class_exists(’DV_Encoding’) ){ require_once ROOT_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分词关键 ************* if ( preg_match(”/^[x00-x7f]+$/i”,$tmpStr) === 1 ) $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”, ” $strLen = $objEnc->StrLength($tmpStr)-1; for( $i = 0 ; $i < $strLen ; $i++ ){ $returnVal[] = $objEnc->SubString($tmpStr,$i,2) } } } return $returnVal; }//end function DV_ChineseWordSegment //fcicq:这就是传说中的substr.偶相信很多人写出来的php代码都比这个好. if( !is_numeric($start) ){ return false; } $strLen = strlen($str); if( $strLen < = 0 ){ return false; } 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; }//end function SubString //插入全文搜索分词表.一共两个,一个 topic_ft,一个bbs_ft $arrTopicIndex =& DV_ChineseWordSegment($topic); if( !empty($arrTopicIndex) && is_array($arrTopicIndex) ){ $topicindex = $db->escape_string(implode(’ ‘,$arrTopicIndex)); if( $topicindex !== ” ){ $db->query(”UPD ATE {$dv}topic_ft SET topicindex=’ } else{ $db->query(”DEL ETE FROM {$dv}topic_ft } } |
这就是所谓的mysql全文搜索分词,mysql不会分词,而php会.就这么简单.
这固然是一种对比过期的办法,但是非常实用.
以上是“MySQL数据库对dvbbs.php全文搜索的完好解析[MySQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |