当前位置:七道奇文章资讯数据防范MySQL防范
日期:2011-01-25 22:43:00  来源:本站整理

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
(title,body) AGAINST
-> (’Security implications of
running MySQL as root’) AS score
-> FROM articles WHERE MATCH
(title,body) AGAINST
-> (’Security implications of
running MySQL as root’);

所以,到这里你应当会mysql 英文全文搜索了.

请注意一个问题.

一些词在全文搜索中会被忽视:

* 任何过于短的词城市被忽视. 全文搜索所能找到的词的默许最小长度为 4个字符.

* 终止字中的词会被忽视.

mysql还自带查询扩大功效.这里不做过量谈论.

下面举行php中文全文搜索的解析

曾经有一个版本的mysql支持中文全文搜索(海量 mysql chinese+,说是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_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分词关键 *************
foreach( $arr as $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;

}//end function DV_ChineseWordSegment

//fcicq:这就是传说中的substr.偶相信很多人写出来的php代码都比这个好.
function &SubString(&$str,$start,$length=null){

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=’
{$topicindex}’ WHERE topicid=’{$RootID}’”);

} else{

$db->query(”DEL ETE FROM {$dv}topic_ft
 WHERE topicid=’{$RootID}’”);

}

}
}

这就是所谓的mysql全文搜索分词,mysql不会分词,而php会.就这么简单.

这固然是一种对比过期的办法,但是非常实用.   以上是“MySQL数据库对dvbbs.php全文搜索的完好解析[MySQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • Windows 搭配 IIS7 PHP MySQL 环境
  • mysql Out of memory (Needed 16777224 bytes)的错误办理
  • mysql提醒[Warning] Invalid (old?) table or database name问题的办理办法
  • mysql启用skip-name-resolve情势时呈现Warning的处理办法
  • mysql启用skip-name-resolve情势时呈现Warning的处理办法
  • MySQL Order By语法介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • mysql数据库插入速度和读取速度的调整记录
  • MySQL Order By索引优化办法
  • MySQL Order By用法分享
  • mysql #1062 –Duplicate entry ''1'' for key ''PRIMARY''
  • MySQL Order By Rand()效率解析
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .