国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

PHP+MYSQL實現全文檢索及全文檢索工具

2020-03-22 17:19:33
字體:
來源:轉載
供稿:網友
  • 使用分詞類庫,分詞類庫請參見:http://www.xunsearch.com/scws/

    如何使用PHP實現全文檢索功能?
    很多人可能馬上可以想出幾種方案,比如:文件檢索法、采用SQL的like語句等方法,但這些方法效率都相當的低。
    這里介紹一種比較高效的PHP全文檢索實現方法,這就是采用MYSQL的FULLTEXT字段類型。但是MYSQL的FULLTEXT字段對中文的支持不是很好,本文也一并介紹如何通過PHP+MYSQL實現中文全文檢索功能。
    首先需要用到一個PHP中文分詞擴展模塊——SCWS,關于這個模塊的安裝和使用大家可以到www.ftphp.com/scws去查找相關內容(如有問題請留言)。
    然后再看看mysql的fulltext字段類型的相關信息:
    html' target='_blank'>MySQL3.23.23之后的版本開始支持全文索引和搜索。全文索引在 MySQL 中是一個 FULLTEXT 類型索引。
    FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE 時或之后使用 ALTER TABLE 或 CREATE INDEX 在 CHAR、VARCHAR 或 TEXT 列上創建。對于大的數據庫,將數據裝載到一個沒有 FULLTEXT 索引的表中,然后再使用 ALTER TABLE (或 CREATE INDEX) 創建索引,這將是非常快的。將數據裝載到一個已經有 FULLTEXT 索引的表中,將是非常慢的。

    MYSQL全文搜索通過 MATCH() 函數完成。
    下面舉一簡單例子:
    1、新建數據表:
    CREATE TABLE fulltext_sample(copy TEXT,FULLTEXT(copy)) TYPE=MyISAM;
    這里的copy就是一個fulltext類型的字段,如果建表的時候沒有添加全文檢索字段,也可以通過alert來添加,如:
    ALTER TABLE fulltext_sample ADD FULLTEXT(copy)
    2、插入數據:
    INSERT INTO fulltext_sample VALUES
    ('It appears good from here'),
    ('The here and the past'),
    ('Why are we hear'),
    ('An all-out alert'),
    ('All you need is love'),
    ('A good alert');
    3、數據檢索:
    SELECT * FROM fulltext_sample WHERE MATCH(copy) AGAINST('love');
    上面就是mysql的全文檢索功能,注意:在全文索引上進行搜索是不區分大小寫的。

    下面再看如何實現中文全文檢索。
    fulltext字段是以詞語為單位,詞語之間需要用空格隔開,而漢語的句子中各個詞語之間并不會用空格隔開,因此我們需要對中文進行分詞,這也就是為什么上面需要強詞用到中文分詞擴展模塊。
    但是盡管對中文進行分詞,MYSQL還是不能通過MATCH來實現中文的全文檢索,這需要通過一定的方法來進行轉換,一個比較簡單實用的方法是采用下面這個函數(當然還有更好的),它將中文進行了urlencode轉換。
    function q_encode($str)
    {
    $data = array_filter(explode(" ",$str));
    $data = array_flip(array_flip($data));
    foreach ($data as $ss) {
    if (strlen($ss)>1 )
    $data_code .= str_replace("%","",urlencode($ss)) . " ";
    }
    $data_code = trim($data_code);
    return $data_code;
    }
    將轉換過后的內容保存至事先定義好的fulltext字段。同樣,在查詢的時候也需要將查詢的關鍵詞進行同樣方法的轉換。

    PHP+Mysql實現UTF8全文搜索的方法

    本文講解一下如何在海量的數據中能夠快速的進行全文檢索呢?MySQL提供了一個全文索引功能,也就是把字段設置上FULLTEXT索引屬性,然后通過SELECT的MATCH AGAINST語句進行查找。

    我們開發的一個純英文站點TouchUs - The Global Yellow Pages & Business Directory(www.touchus.org)就是利用MySQL的這一功能,實現了對十多萬條數據的平均全文檢索時間小于0.5秒。但是在開發TouchUs的中文網站——城市黃頁網時(www.city39.cn),碰到了新的問題。原來英文排版時詞和詞之間是通過空格區分的,FULLText可以完全支持,但是對中文或者是東亞文字就沒有這么簡單了,因為中文的詞和詞之間并沒有明顯的分隔,所以MySQL不支持中文字符的全文檢索。

    如何讓MySQL也能支持中文的全文檢索呢?偶然間產生了一個思路,那就是能不能在中文分詞后,通過對中文進行編碼轉化成英文字符,這樣就在中英文間建立一個特定的聯系,然后再進行全文檢索,這樣不就實現了中文的全文索引了嗎?經過試驗,答案是肯定的。下面是在城市黃頁網中實現的具體過程:

    1. 建立一個單獨的索引表,比如對應members表,我們建立一個members_index表。

    用戶信息表(members) 用戶信息全文索引表(members_index)

    User_id user_id

    User_name index_intro

    User_introduction

    在members_index表的index_intro中加入fulltext索引。

    2. 對用戶信息表(members)的User_introduction字段內容進行中文分詞處理

    中文分詞的處理過程,可以參考簡易中文分詞系統http://www.ftphp.com/scws/,在城市黃頁網中,我們采用了scws的PHP擴展模塊方式來實現中文分詞。scws的php擴展模塊安裝非常簡單,只需簡單編譯配置后即可使用。在具體的php代碼中,我們寫了如下的函數來實現分詞后將分詞結果用空格進行連接。

    //中文分詞函數

    function str_fc($str) {

    $so = scws_new();

    $so->set_charset('utf8');

    // 這里沒有調用 set_dict 和 set_rule 系統會自動試調用 ini 中指定路徑下的詞典和規則文件

    $so->send_text($str);

    while ($tmp = $so->get_result())

    {

    foreach ( $tmp as $ss ){

    $s = trim($ss[word]);

    if ( $s )

    $mystr .= trim($ss[word]) . " ";

    //echo urlencode(trim($ss[word])) . " ";

    }

    }

    return $mystr;

    }

    該函數返回就是用空格連接的分詞結果。

    3. 對分詞結果進行編碼,可以采用多種編碼方式,比如base64編碼、urlencode編碼、漢字轉拼音等,對gb2312甚至可以采用區位碼編碼方式。考慮到存儲空間以及便利性,我們采用了PHP的urlencode編碼方式。需要注意的是,在編碼前,我們可以去掉重復的分詞來節約存儲空間,編碼后要去掉編碼結果中的%符號,因為urlencode采用RFC 1738???行編碼,會產生很多%,而%在MySQL是通配符。下面是編碼過程用到的PHP代碼

    $data = str_fc($data); //中文分詞

    $data = array_filter(explode(" ",$data)); //刪除數組空項

    $data = array_flip(array_flip($data)); //刪除重復項

    //對分詞結果進行urlcode編碼

    foreach ( $data as $ss ) {

    if (strlen($ss)>1 )

    $data_code .= str_replace("%","",urlencode($ss)) . " ";

    }

    這里的$data_code就是編碼后的結果。把編碼結果根據user_id存入用戶信息全文索

    引表(members_index)

    4. 在進行搜索處理時,首先對用戶輸入的關鍵字進行同樣的分詞編碼處理,然后通過MySQL的SELECT的MATCH AGAINST語句進行全文快速檢索,根據檢索結的user_id即可調用用戶信息表(members)中的原始數據進行顯示,而沒有必要進行一次解碼重組。

    以上MySQL UTF8中文全文檢索方法.

    全文檢索工具:http://www.xunsearch.com


    PHP編程

    鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    主站蜘蛛池模板: 嫩江县| 板桥市| 元朗区| 正镶白旗| 新疆| 蚌埠市| 渭源县| 青神县| 怀仁县| 杭锦后旗| 元江| 莫力| 当阳市| 广灵县| 新安县| 揭阳市| 河北区| 嘉定区| 临夏县| 囊谦县| 桂东县| 陆良县| 金门县| 清涧县| 得荣县| 邯郸市| 连云港市| 甘洛县| 商洛市| 镶黄旗| 武清区| 赣榆县| 永嘉县| 娄烦县| 屏东县| 沅陵县| 稻城县| 秀山| 望城县| 杭锦后旗| 凤冈县|