程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql支持中文全文檢索的實現方法

mysql支持中文全文檢索的實現方法

編輯:MySQL綜合教程

mysql教程支持中文全文檢索的實現方法

不影響 MySQL 的系統結構及其他功能的前提下,解決了 MySQL 目前對中文全文檢索無法正確支持的缺陷並優化 MySQL 對中文檢索處理的性能。(目前本軟件包支持根據詞典進行簡易的正向最大匹配分詞、支持包括UTF-8、GBK、BIG5 ... 在內的字符集)

經測試效果尚可, 140萬行約 1.4G 數據(不含索引區空間) 檢索大概都在 0.0x ~ 0.x 秒之間. 搭配做一個小型全文檢索將變得十分簡單.

MySQL 從 3.23 的某個小版本開始就已經支持在 MyISAM 表中建立全文索引的字段。由於 CJK(中日韓)字符集及其句法的特殊性(詞與詞之間沒有像英文一樣的間隔),MySQL 一直沒有針對多字節的寬字符集作出應有的支持,也沒有任何分詞能力。

而 MySQL 作為 PHP 等 Web Script 的絕佳搭檔,已經被廣泛應用到各個角落,對於它的檢索令絕大多數開發者頭痛,用 SELECT ... WHERE ... LIKE %...% 的方式不僅效率差(動則掃描全表豈能不慢?),對於中文這樣的特殊語言也存在嚴重的岐義問題(因為詞才是最小的語意單位)。我也在一段時間內受限於 MySQL 的檢索限制,而不得不尋求其它解決方案,但都不太盡人意。

--
順便提一下,有一個叫作海量的分詞技術公司,很早就做過 mysql-chinese 的 hack,只不過遲遲沒有按照 GNU 精神及時發布源碼,所以才決定自己來作。

-- 用 PHP 配合 MySQL (4.0.x) 的全文檢索例子代碼 --

<?php教程
if ($_GET['q'] && $q = trim($_GET['q']))
{
    mysql_connect();
    mysql_select_db("dot66");
    $q = mysql_escape_string($q);
    $r = mysql_query("SELECT SEGMENT('$q')");
    $n = mysql_fetch_row($r);
    $x = explode(" ", $n[0]);
    $m = $str = '';
    $f = $t = array();
    foreach ($x as $tmp)
    {
      if (strlen($tmp) > strlen($m)) $m = $tmp;
      $f[] = "/($tmp)/i";
      $t[] = '<font color=red>1</font>';
    }
    $s1  = "SELECT id,board,owner,chrono,title,SUBSTRING(body,LOCATE('$m', body)-50,200) AS xbody ";
    $s2  = "FROM bbs_posts WHERE MATCH(title,body) AGAINST ('$q'";
    $s2 .= (preg_match('/[<>()~*"+-]/', $q) ? ' IN BOOLEAN MODE' : '');
    $s2 .= ") LIMIT 100"; 
   
    $r = mysql_query("SELECT COUNT(*) $s2");
    $x = mysql_fetch_row($r);
    $x = $x[0];
    $s = $s1 . $s2;
    echo '<div style="border:1px solid red;background-color:#e0e0e0;font-family:tahoma;padding:8px;"><b>The Core SQL Query String:</b><br>' . $s . '</div><br>';
    $r  = mysql_query($s);
    while ($tmp = mysql_fetch_assoc($r))
    {
      if (($pos = strpos($tmp['owner'], '.')) || ($pos = strpos($tmp['owner'], '@')))
        $tmp['owner'] = substr($tmp['owner'],0,$pos).'.';
      $str .= "<li><a href="?id=$tmp[id]" onclick="return false;" style="text-decoration:underline;color:blue" title="點擊浏覽...">$tmp[title]</a> <small><font color=green>(看板: $tmp[board])</font></small><br>n";
      $str .= "<small> ... $tmp[xbody] ...</small><br>n";
      $str .= "<small style="color:green;font-family:tahoma;">Author: <u>$tmp[owner]</u> Date: " . date("Y-m-d H:i", $tmp['chrono']) . "</small>n";
      $str .= "</li><br><br>n";
    }
    $f[] = '/x1b[.*?m/';
    $t[] = '';
    $str = preg_replace($f, $t, $str);
  } 
  mysql_close();
}
?>
<title>BBS(看板檢索: powered by MySQL fulltext+)</title>
<style type="text/css教程">
body { line-height: 125%; }
</style>
<h2>BBS(看板檢索: powered by MySQL fulltext+)</h2>
<form method=get style="margin:0">
<input type=text name=q size=30 value="<?php echo $_GET['q'];?>">
<input type=submit value="Search!">
<small>
(隨便輸入字符串檢索, 還可以用簡單的 +/- 哦, 收錄約有 140萬篇文章)
</small>
</form>
<ol>
<?php echo $str; ?>
</ol>

這是一個朋友自己做的

業界評論海量科技的分詞技術目前被認為是國內最好的中文分詞技術,其分詞准確度超過99%,由此也使得中搜在搜索結果中搜索結果的錯誤率很低。

海量http://www.hylanda.com/server/
下載MySQL5.0.37--LinuxX86-Chinese+
不需要提前安裝mysql 然後依次執行
groupadd mysql
useradd -g mysql mysql
cd /usr/local
gunzip < /root/mysql-chplus-5.0.37-linux-i686.tar.gz|tar xvf -
ln -s /usr/local/mysql-chplus-5.0.37 /usr/local/mysql
cd mysql
scritps教程/mysql_install_db --user=mysql
chown -R mysql data
chown -R mysql .
/usr/local/mysql/bin/mysqld_safe --user=mysql &
即可   測試:
create table test ( testid int(4) not null , testtitle varchar(256), testbody varchar(256), fulltext(testtitle,testbody));
insert into test values
->(NULL,'你好嗎','特斯他你好嗎'),
->(NULL,'好你好','好你好');
select * from test where match(testtitle,testbody) against('你好' in boolean mode);


Hightman的 scws
http://www.hightman.cn/index.php?myft
http://www.hightman.cn/bbs/viewthread.php?tid=18&extra=page%3D1&page=1
因為以下文章 放棄
參考http://www.blogjava.net/cap
利用mysql中文分詞插件,這個東西倒是很好,但是偏偏只支持mysql4.0,和mysql 5.1 beta, 剛好不支持我目前用的mysql5.0.x 由於沒有現成版本可以用, 也只好放棄

還發現一個 但未試驗
參考http://www.lietu.com/doc/MysqlSeg.htm

一、來源
Mysql全文檢索的解析器缺省是按空格切分的,不能直接支持全文檢索中文。從5.1版本開始,Mysql全文檢索的解析器以插件的方式提供。獵兔提供符合Mysql插件格式的中文分詞模塊。
二、環境與安裝
      首先下載Mysql5.1版本。然後在gb2312或gbk的環境下啟動Mysql服務。

# cd /usr/local/mysql/bin
# ./mysqld-max --user=mysql --default-character-set=gbk
       把seg.so拷貝到插件指定的路徑,缺省是 /usr/local/mysql/lib/mysql
# cp ./seg.so /usr/local/mysql/lib/mysql/seg.so
       把詞典拷貝到Mysql的Data路徑下的Dic子目錄,缺省是 /usr/local/mysql/data/Dic/
      進入Mysql:
# mysql --default-character-set=gbk
       安裝插件:
mysql>INSTALL PLUGIN cn_parser SONAME 'seg.so';
三、使用中文分詞插件
       創建表:
mysql>CREATE TABLE t (c VARCHAR(255), FULLTEXT (c) WITH PARSER cn_parser) default charset gbk;
mysql>INSERT INTO t VALUES ('測試中文');
mysql>INSERT INTO t VALUES ('老師說明天開會');
mysql> INSERT INTO t VALUES ('購買手機');
       查詢:
mysql> SELECT MATCH(c) AGAINST('說明'),c FROM t;

+-----------------------------------+-----------------------+

| MATCH(c) AGAINST('說明') | c                           |

+-----------------------------------+-----------------------+

|                                           0 | 測試中文              |

|                                           0 | 老師說明天開會 |

|                                           0 | 購買手機           |

+-----------------------------------+-----------------------+

3 rows in set (0.00 sec)

mysql> SELECT MATCH(c) AGAINST('說'), c FROM t;

+--------------------------------+-----------------------+

| MATCH(c) AGAINST('說') | c                           |

+--------------------------------+-----------------------+

|                                       0 | 測試中文              |

|             0.58370667695999 | 老師說明天開會   |

|                                       0 | 購買手機              |

+--------------------------------+-----------------------+

3 rows in set (0.00 sec)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved