MySQL資料庫對dvbbs.php全文檢索搜尋的完全分析

來源:互聯網
上載者:User

好幾天都沒有更新文章了,唉,人就是懶呀。

首先,大家先去下載一份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會。就這麼簡單。

這雖然是一種比較過時的方法,但是非常實用。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.