<s id="qx03x"></s>
  • <tt id="qx03x"><noscript id="qx03x"></noscript></tt><rt id="qx03x"><nav id="qx03x"></nav></rt>

    <strong id="qx03x"><li id="qx03x"></li></strong>
    <tt id="qx03x"></tt>

        1. 分頁: 1/1 第一頁 1 最后頁 [ 顯示模式: 摘要 | 列表 ]
            [文章作者:張宴 本文版本:v1.0 最后修改:2010.02.05 轉載請注明原文鏈接:http://blog.www.lukangtou.cn/sphinx_search/]

            前言:

            2008年7月,我寫過一篇文章《基于Sphinx+MySQL的千萬級數據全文檢索(搜索引擎)架構設計》。有不少網友希望閱讀全文,我將該文檔整理了一下,分享出來。文檔解壓后大小為7.33M,共19頁。

            本站下載地址: http://blog.www.lukangtou.cn/book/sphinx/sphinx_mysql.zip

            新浪下載分流: http://ishare.iask.sina.com.cn/f/6728201.html

            上述文檔架構存在的局限,我在2008年12月的文章《億級數據的高并發通用搜索引擎架構設計》中已經指出:一是MySQL本身的并發能力有限,在200~300個并發連接下,查詢和更新就比較慢了;二是由于MySQL表的主鍵與Sphinx索引的ID一一對應,從而無法跨多表建立整站查詢,而且新增加類別還得修改配置文件,比較麻煩;三是因為和MySQL集成,無法發揮出Sphinx的優勢。雖然如此,但對于一些寫入量不大的搜索應用,已經足夠了,或許對很多人會有幫助。



            正文:

            在這之后,本人基于《億級數據的高并發通用搜索引擎架構設計》開發的Sphinx分布式通用站內搜索引擎平臺,已經在生產環境運行9個月以上,經過運營中的不斷完善與改進,目前已形成了一套可擴展的分布式通用站內搜索引擎框架。CMS、視頻、論壇等產品發生的增、刪、改操作,文本內容實時寫入自行開發的 HTTPSQS 高性能簡單消息隊列服務,通過隊列控制器更新索引和存儲。提供支持XML、JSON的API查詢接口,支持億級數據的索引、分布式、中文分詞、高亮顯示、自動摘要、準實時(1分鐘內)增量索引更新。

            點擊在新窗口中瀏覽此圖片

            下面是Sphinx新的搜索架構中技術關鍵點實現方式的一些介紹,與大家分享、交流一下:

            1、一元分詞和中文分詞的結合:

           ?、?、一元分詞位于索引更新模塊。Sphinx索引引擎對于CJK(中日韓)語言(必須是UTF-8編碼)支持一元切分,假設【反恐行動是國產主視角射擊網絡游戲】這段文字,Sphinx會將其切成【反 恐 行 動 是 國 產 主 視 角 射 擊 網 絡 游 戲】,然后對每個字建立反向索引。如果用這句話中包含的字組成一個不存在的詞語,例如【恐動】,也會被搜索到,所以搜索時,需要加引號,例如搜索【"反恐行動"】,就能完全匹配連在一起的四個字,不連續的【"恐動"】就不會被搜索到。但是,這樣還有一個問題,搜索【"反恐行動游戲"】或【"國產網絡游戲"】就會搜索不到。對于這個問題,采用位于搜索查詢模塊的中文分詞來處理。

            sphinx.conf配置文件中關于UTF-8中文一元分詞的配置如下:
          ...省略...
          index t_source_main
          {
                  source                  = t_source_main
                  path                    = /data0/search/sphinx/data/t_source_main
                  docinfo                 = extern
                  mlock                   = 0
                  morphology              = none
                  min_word_len            = 1
                  charset_type            = utf-8
                  min_prefix_len          = 0
                  html_strip              = 1
                  charset_table           = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F
                  ngram_len               = 1
                  ngram_chars             = U+3000..U+2FA1F
          }
          ...省略...


           ?、?、中文分詞位于搜索查詢模塊。搜索“反恐行動游戲”、“國產網絡游戲”,先調用獨立的中文分詞系統,分別切分為“反恐行動 游戲”、“國產 網絡游戲”,這時候,再給以空格分隔的詞語加上引號,去Sphinx搜索【"反恐行動" "游戲"】或【"國產" "網絡游戲"】,就能搜索到這條記錄了。中文分詞詞庫發生增、刪、改,無需重建整個Sphinx搜索索引。



            2、使用自行開發的HTTPSQS(http://code.google.com/p/httpsqs)開源簡單隊列服務程序,來緩沖高并發數據寫入

            新聞、論壇帖子、客服公告、SNS社區等發生的增、刪、改操作,文本內容通過更新接口實時寫入HTTPSQS隊列,再通過隊列控制器更新到Sphinx搜索引擎索引中。



            3、Sphinx不能嚴格按照字段排序的小問題

            如果不想使用權重,只希望嚴格按照時間、主鍵等排序,而匹配模式(Matching modes)又為非SPH_MATCH_BOOLEAN時(比較常用的是SPH_MATCH_ALL、SPH_MATCH_EXTENDED),Sphinx搜索結果在某一頁中的排序會不太準確。例如:按照UNIX時間戳倒序排序,0,20為第一頁,20,40為第二頁,第一頁的最小時間戳一定會大于第二頁的最大時間戳,但是,第一頁中的0,20條記錄卻不會嚴格按照時間戳排序,第二頁亦是如此。因此,如果需要精確排序,用戶翻到搜索結果的某一頁,就需要對Sphinx在某一搜索結果頁中的記錄另行再排序,在我的這套搜索架構中,這一再排序操作由search.php查詢接口使用array_multisort()函數處理。一般情況下,一頁只會顯示5~30條記錄,因此,只對幾十條記錄采用PHP再排序,速度也是非??斓?。



            4、隊列控制器中“時間控制”與“數量控制”相結合,實現搜索索引的1分鐘內準實時更新:

           ?、?、Sphinx 0.9.9生產環境的建索引速度大約在5.5 Mbytes/秒、6400文檔/秒。隊列控制器可以設置10秒鐘更新一次增量索引,只要Sphinx增量索引數據源的文檔數在38萬以內,就能保證增量索引在1~60秒內得到更新,這是從“時間”上進行控制。

           ?、?、為了避免增量索引數據源的文檔數增長到38萬,隊列控制器在增量索引數據源的文檔數超過1萬時,還將激活增量索引合并入主索引的操作,合并完成的文檔將從增量索引數據源中刪除,這是從“數量”上進行控制。
          Tags: , ,
            發布版本:
            httpcws 1.0.0 (最新版本:2009-08-10發布)

            程序網址:http://code.google.com/p/httpcws

            安裝使用手冊:http://blog.www.lukangtou.cn/httpcws_v100/

            下載地址(32位版):http://httpcws.googlecode.com/files/httpcws-1.0.0-i386-bin.tar.gz

            下載地址(64位版):http://httpcws.googlecode.com/files/httpcws-1.0.0-x86_64-bin.tar.gz

            中文分詞在線演示:http://blog.www.lukangtou.cn/demo/httpcws/

            PHP演示程序下載:http://blog.www.lukangtou.cn/demo/httpcws/httpcws-php-demo.zip



            httpcws 中文簡介
            1、什么是 httpcws ?
            HTTPCWS 是一款基于HTTP協議的開源中文分詞系統,目前僅支持Linux系統。HTTPCWS 使用“ICTCLAS 3.0 2009共享版中文分詞算法”的API進行分詞處理,得出分詞結果。HTTPCWS 將取代本人之前開發的 PHPCWS 中文分詞擴展。

            ICTCLAS(Institute of Computing Technology, Chinese Lexical Analysis System)是中國科學院計算技術研究所在多年研究工作積累的基礎上,基于多層隱馬模型研制出的漢語詞法分析系統,主要功能包括中文分詞;詞性標注;命名實體識別;新詞識別;同時支持用戶詞典。ICTCLAS經過五年精心打造,內核升級6次,目前已經升級到了ICTCLAS3.0,分詞精度98.45%,各種詞典數據壓縮后不到3M。ICTCLAS在國內973專家組組織的評測中活動獲得了第一名,在第一屆國際中文處理研究機構SigHan組織的評測中都獲得了多項第一名,是當前世界上最好的漢語詞法分析器。

            ICTCLAS 3.0 商業版是收費的,而免費提供的 ICTCLAS 3.0 共享版不開源,詞庫是根據人民日報一個月的語料得出的,很多詞語不存在。所以本人補充的一個19萬條詞語的自定義詞庫,對ICTCLAS分詞結果進行合并處理,輸出最終分詞結果。

            由于 ICTCLAS 3.0 2009 共享版只支持GBK編碼,因此,如果是UTF-8編碼的字符串,可以先用iconv函數轉換成GBK編碼,再用httpcws進行分詞處理,最后轉換回UTF-8編碼。

            HTTPCWS 軟件自身(包括httpcws.cpp源文件、dict/httpcws_dict.txt自定義詞庫)采用NewBSD開源協議,可以自由修改。HTTPCWS 使用的 ICTCLAS 共享版 API 及 dict/Data/ 目錄內的語料庫,版權及著作權歸中國科學院計算技術研究所、ictclas.org所有,使用需遵循其相關協議。



            2、httpcws 中文分詞在線演示
            演示網址:http://blog.www.lukangtou.cn/demo/httpcws/



            3、httpcws 中文分詞下載安裝
            32位版:
          cd /usr/local/
          wget http://httpcws.googlecode.com/files/httpcws-1.0.0-i386-bin.tar.gz
          tar zxvf httpcws-1.0.0-i386-bin.tar.gz
          rm -f httpcws-1.0.0-i386-bin.tar.gz
          cd httpcws-1.0.0-i386-bin/
          ulimit -SHn 65535
          /usr/local/httpcws-1.0.0-i386-bin/httpcws -d -x /usr/local/httpcws-1.0.0-i386-bin/dict/


            64位版:
          cd /usr/local/
          wget http://httpcws.googlecode.com/files/httpcws-1.0.0-x86_64-bin.tar.gz
          tar zxvf httpcws-1.0.0-x86_64-bin.tar.gz
          rm -f httpcws-1.0.0-x86_64-bin.tar.gz
          cd httpcws-1.0.0-x86_64-bin/
          ulimit -SHn 65535
          /usr/local/httpcws-1.0.0-x86_64-bin/httpcws -d -x /usr/local/httpcws-1.0.0-x86_64-bin/dict/


            命令行啟動參數:

            點擊在新窗口中瀏覽此圖片



            4、httpcws 使用方法
            GET方法(文本長度受URL的長度限制,需要分詞的文本為GBK編碼,最好采用urlencode對文本進行編碼):


            POST方法(文本長度無限制,適用于大文本分詞,需要分詞的文本為GBK編碼,最好采用urlencode對文本進行編碼):
          curl -d "有人的地方就有江湖" http://192.168.8.42:1985
          curl -d "%D3%D0%C8%CB%B5%C4%B5%D8%B7%BD%BE%CD%D3%D0%BD%AD%BA%FE" http://192.168.8.42:1985


            PHP 調用 HTTPCWS 示例:

           ?、?、對GBK編碼的字符串進行中文分詞處理(HTTP POST方式):
          <?php
          @header('Content-Type: text/html; charset=gb2312');
          $text = "有人的地方就有江湖";
          $text = urlencode($text);
          $opts = array(
            'http'=>array(
              'method'=>"POST",
              'header'=>"Content-type: application/x-www-form-urlencoded\r\n".
                        "Content-length:".strlen($data)."\r\n" .
                        "Cookie: foo=bar\r\n" .
                        "\r\n",
              'content' => $text,
            )
          );
          $context = stream_context_create($opts);
          $result = file_get_contents("http://127.0.0.1:1985", false, $context);
          echo $result;
          ?>

            [文章/程序 作者:張宴 本文版本:v1.3 最后修改:2009.07.06 轉載請注明原文鏈接:http://blog.www.lukangtou.cn/phpcws_v100/]

            注:最新的分詞系統 HTTPCWS 已經發布,用來取代 PHPCWS。

            請點擊以下網址下載 HTTPCWS:


            http://code.google.com/p/httpcws

            原來的 PHPCWS 停止更新。




            名稱:PHPCWS(PHP中文分詞擴展)
            協議:New BSD License
            作者:張宴
            網址:http://code.google.com/p/phpcws/
            SVN:http://code.google.com/p/phpcws/source/browse/#svn/trunk/phpcws

            一、PHPCWS 簡介

            1、什么是 PHPCWS ?
            PHPCWS 是一款開源的PHP中文分詞擴展,目前僅支持Linux/Unix系統。

            PHPCWS 先使用“ICTCLAS 3.0 共享版中文分詞算法”的API進行初次分詞處理,再使用自行編寫的“逆向最大匹配算法”對分詞和進行詞語合并處理,并增加標點符號過濾功能,得出分詞結果。

            ICTCLAS(Institute of Computing Technology, Chinese Lexical Analysis System)是中國科學院計算技術研究所在多年研究工作積累的基礎上,基于多層隱馬模型研制出的漢語詞法分析系統,主要功能包括中文分詞;詞性標注;命名實體識別;新詞識別;同時支持用戶詞典。ICTCLAS經過五年精心打造,內核升級6次,目前已經升級到了ICTCLAS3.0,分詞精度98.45%,各種詞典數據壓縮后不到3M。ICTCLAS在國內973專家組組織的評測中活動獲得了第一名,在第一屆國際中文處理研究機構SigHan組織的評測中都獲得了多項第一名,是當前世界上最好的漢語詞法分析器。

            ICTCLAS 3.0 商業版是收費的,而免費提供的 ICTCLAS 3.0 共享版不開源,詞庫是根據人民日報一個月的語料得出的,很多詞語不存在。所以本人對ICTCLAS分詞后的結果,再采用逆向最大匹配算法,根據自己補充的一個9萬條詞語的自定義詞庫(與ICTCLAS詞庫中的詞語不重復),對ICTCLAS分詞結果進行合并處理,輸出最終分詞結果。

            由于 ICTCLAS 3.0 共享版只支持GBK編碼,因此,如果是UTF-8編碼的字符串,可以先用PHP的iconv函數轉換成GBK編碼,再用phpcws_split函數進行分詞處理,最后轉換回UTF-8編碼。

            2、PHPCWS 中文分詞在線演示

            演示網址:http://blog.www.lukangtou.cn/demo/phpcws/

            3、PHPCWS 分詞速度及用途

            初次使用時,Apache 或 php-cgi(FastCGI) 進程,需要加載一次詞庫到內存中,需要0.0X秒。58字節的一句話——“2009年2月13日,我編寫了一款PHP中文分詞擴展:PHPCWS 1.0.0?!?,分詞速度只需0.0003秒。

            PHPCWS 屬于《億級數據的高并發通用搜索引擎架構設計》的一部分,用作“搜索查詢接口”的關鍵字分詞處理。在此架構中,Sphinx索引引擎對于CJK(中日韓)語言支持一元切分,假設【反恐行動是國產主視角射擊網絡游戲】這段文字,Sphinx會將其切成【反 恐 行 動 是 國 產 主 視 角 射 擊 網 絡 游 戲】,然后對每個字建立反向索引。如果用這句話中包含的字組成一個不存在的詞語,例如【恐動】,也會被搜索到,所以搜索時,需要加引號,例如搜索【"反恐行動"】,就能完全匹配連在一起的四個字,不連續的【"恐動"】就不會被搜索到。但是,這樣還有一個問題,搜索【"反恐行動游戲"】或【"國產網絡游戲"】就會搜索不到。所以,我在搜索層寫了個PHP中文分詞擴展,搜索“反恐行動游戲”、“國產網絡游戲”,會被PHPCWS中文分詞函數分別切分為“反恐行動 游戲”、“國產 網絡游戲”,這時候,用PHP函數給以空格分隔的詞語加上引號,去搜索【"反恐行動" "游戲"】或【"國產" "網絡游戲"】,就能搜索到這條記錄了。由于PHPCWS位于搜索層,中文分詞詞庫發生增、刪、改,只需平滑重啟一次Web服務器或php-cgi進程即可,無需重建搜索索引。

            根據上述情況,對于那些采用二元交叉切分的搜索引擎,PHPCWS用在前端搜索層對用戶輸入的搜索關鍵字、短語進行分詞處理,同樣適合。PHPCWS開發的目的正在于此,對于短句、小文本中文分詞切分,速度非常之快。

            4、自定義詞庫

            自定義詞庫名稱為userdict.tch,格式為 Tokyo Cabinet DBM 的 Abstract key-value 內存哈希數據庫(key為GBK編碼的詞語名詞,value為詞頻。目前詞頻均填1,暫時用不上)。自定義詞庫的修改在安裝步驟中會詳細介紹。



            二、phpcws 1.0.1 安裝步驟
            [文章作者:張宴 本文版本:v1.0 最后修改:2008.12.09 轉載請注明原文鏈接:http://blog.www.lukangtou.cn/post/385/]

            曾經在七月,寫過一篇文章──《基于Sphinx+MySQL的千萬級數據全文檢索(搜索引擎)架構設計》,前公司的分類信息搜索基于此架構,效果明顯,甚至將很大一部分帶Where條件的MySQL SQL查詢,都改用了Sphinx+MySQL搜索。但是,這套架構仍存在局限:一是MySQL本身的并發能力有限,在200~300個并發連接下,查詢和更新就比較慢了;二是由于MySQL表的主鍵與Sphinx索引的ID一一對應,從而無法跨多表建立整站查詢,而且新增加類別還得修改配置文件,比較麻煩;三是因為和MySQL集成,無法發揮出Sphinx的優勢。

            最近,我設計出了下列這套最新的搜索引擎架構,目前已經寫出“搜索查詢接口”和“索引更新接口”的beta版。經測試,在一臺“奔騰四 3.6GHz 雙核CPU、2GB內存”的普通PC機,7000萬條索引記錄的條件下,“搜索查詢接口”平均查詢速度為0.0XX秒(查詢速度已經達到百度、谷歌、搜狗、中國雅虎等搜索引擎的水平,詳見文章末尾的“附2”),并且能夠支撐高達5000的并發連接;而“索引更新接口”進行數據分析、入隊列、返回信息給用戶的全過程,高達1500 Requests/Sec。

            “隊列控制器”這一部分是核心,它要控制隊列讀取,更新MySQL主表與增量表,更新搜索引擎數據存儲層Tokyo Tyrant,準實時(1分鐘內)完成更新Sphinx增量索引,定期合并Sphinx索引。我預計在這周寫出beta版。

          點擊在新窗口中瀏覽此圖片

            圖示說明:
            1、搜索查詢接口:
            [文章作者:張宴 本文版本:v1.0 最后修改:2008.07.27 轉載請注明原文鏈接:http://blog.www.lukangtou.cn/post/360/]

            前言:本文闡述的是一款經過生產環境檢驗的千萬級數據全文檢索(搜索引擎)架構。本文只列出前幾章的內容節選,不提供全文內容。

            在DELL PowerEdge 6850服務器(四顆64 位Inter Xeon MP 7110N處理器 / 8GB內存)、RedHat AS4 Linux操作系統、MySQL 5.1.26、MyISAM存儲引擎、key_buffer=1024M環境下實測,單表1000萬條記錄的數據量(這張MySQL表擁有int、datetime、varchar、text等類型的10多個字段,只有主鍵,無其它索引),用主鍵(PRIMARY KEY)作為WHERE條件進行SQL查詢,速度非常之快,只耗費0.01秒。

            出自俄羅斯的開源全文搜索引擎軟件Sphinx,單一索引最大可包含1億條記錄,在1千萬條記錄情況下的查詢速度為0.x秒(毫秒級)。Sphinx創建索引的速度為:創建100萬條記錄的索引只需3~4分鐘,創建1000萬條記錄的索引可以在50分鐘內完成,而只包含最新10萬條記錄的增量索引,重建一次只需幾十秒。

            基于以上幾點,我設計出了這套搜索引擎架構。在生產環境運行了一周,效果非常不錯。有時間我會專為配合Sphinx搜索引擎,開發一個邏輯簡單、速度快、占用內存低、非表鎖的MySQL存儲引擎插件,用來代替MyISAM引擎,以解決MyISAM存儲引擎在頻繁更新操作時的鎖表延遲問題。另外,分布式搜索技術上已無任何問題。



            一、搜索引擎架構設計:
            1、搜索引擎架構圖:
            點擊在新窗口中瀏覽此圖片

            2、搜索引擎架構設計思路:
            (1)、調用方式最簡化:
            盡量方便前端Web工程師,只需要一條簡單的SQL語句“SELECT ... FROM myisam_table JOIN sphinx_table ON (sphinx_table.sphinx_id=myisam_table.id) WHERE query='...';”即可實現高效搜索。

            (2)、創建索引、查詢速度快:
           ?、?、Sphinx Search 是由俄羅斯人Andrew Aksyonoff 開發的高性能全文搜索軟件包,在GPL與商業協議雙許可協議下發行。
            Sphinx的特征:
            ?Sphinx支持高速建立索引(可達10MB/秒,而Lucene建立索引的速度是1.8MB/秒)
            ?高性能搜索(在2-4 GB的文本上搜索,平均0.1秒內獲得結果)
            ?高擴展性(實測最高可對100GB的文本建立索引,單一索引可包含1億條記錄)
            ?支持分布式檢索
            ?支持基于短語和基于統計的復合結果排序機制
            ?支持任意數量的文件字段(數值屬性或全文檢索屬性)
            ?支持不同的搜索模式(“完全匹配”,“短語匹配”和“任一匹配”)
            ?支持作為Mysql的存儲引擎

           ?、?、通過國外《High Performance MySQL》專家組的測試可以看出,根據主鍵進行查詢的類似“SELECT ... FROM ... WHERE id = ...”的SQL語句(其中id為PRIMARY KEY),每秒鐘能夠處理10000次以上的查詢,而普通的SELECT查詢每秒只能處理幾十次到幾百次:
            點擊在新窗口中瀏覽此圖片

           ?、?、Sphinx不負責文本字段的存儲。假設將數據庫的id、date、title、body字段,用sphinx建立搜索索引。根據關鍵字、時間、類別、范圍等信息查詢一下sphinx,sphinx只會將查詢結果的ID號等非文本信息告訴我們。要顯示title、body等信息,還需要根據此ID號去查詢MySQL數據庫,或者從Memcachedb等其他的存儲中取得。安裝SphinxSE作為MySQL的存儲引擎,將MySQL與Sphinx結合起來,是一種便捷的方法。
            創建一張Sphinx類型表,將MyISAM表的主鍵ID和Sphinx表的ID作一個JOIN聯合查詢。這樣,對于MyISAM表來所,只相當于一個WHERE id=...的主鍵查詢,WHERE后的條件都交給Sphinx去處理,可以充分發揮兩者的優勢,實現高速搜索查詢。

            (3)、按服務類型進行分離:
            為了保證數據的一致性,我在配置Sphinx讀取索引源的MySQL數據庫時,進行了鎖表。Sphinx讀取索引源的過程會耗費一定時間,由于MyISAM存儲引擎的讀鎖和寫鎖是互斥的,為了避免寫操作被長時間阻塞,導致數據庫同步落后跟不上,我將提供“搜索查詢服務”的和提供“索引源服務”的MySQL數據庫進行了分開。監聽3306端口的MySQL提供“搜索查詢服務”,監聽3406端口的MySQL提供“索引源服務”。

            (4)、“主索引+增量索引”更新方式:
            一般網站的特征:信息發布較為頻繁;剛發布完的信息被編輯、修改的可能性大;兩天以前的老帖變動性較小。
            基于這個特征,我設計了Sphinx主索引和增量索引。對于前天17:00之前的記錄建立主索引,每天凌晨自動重建一次主索引;對于前天17:00之后到當前最新的記錄,間隔3分鐘自動重建一次增量索引。

            (5)、“Ext3文件系統+tmpfs內存文件系統”相結合:
            為了避免每3分鐘重建增量索引導致磁盤IO較重,從而引起系統負載上升,我將主索引文件創建在磁盤,增量索引文件創建在tmpfs內存文件系統“/dev/shm/”內?!?dev/shm/”內的文件全部駐留在內存中,讀寫速度非???。但是,重啟服務器會導致“/dev/shm/”內的文件丟失,針對這個問題,我會在服務器開機時自動創建“/dev/shm/”內目錄結構和Sphinx增量索引。

            (6)、中文分詞詞庫:
            我根據“自整理的中文分詞庫”+“搜狗拼音輸入法細胞詞庫”+“LibMMSeg高頻字庫”+... 綜合整理成一份中文分詞詞庫,出于某些考慮暫不提供。你可以使用LibMMSeg自帶的中文分詞詞庫。
            [文章+程序 作者:張宴 本文版本:v1.0 最后修改:2008.07.01 轉載請注明原文鏈接:http://blog.www.lukangtou.cn/post/356/]

            MySQL在高并發連接、數據庫記錄數較多的情況下,SELECT ... WHERE ... LIKE '%...%'的全文搜索方式不僅效率差,而且以通配符%和_開頭作查詢時,使用不到索引,需要全表掃描,對數據庫的壓力也很大。MySQL針對這一問題提供了一種全文索引解決方案,這不僅僅提高了性能和效率(因為MySQL對這些字段做了索引來優化搜索),而且實現了更高質量的搜索。但是,至今為止,MySQL對中文全文索引無法正確支持。

            中文與西方文字如英文的一個重要區別在于,西方文字以單詞為單位,單詞與單詞之間以空格分隔。而中文以字為單位,詞由一個或多個字組成,詞與詞之間沒有空格分隔。當試圖在一個含有中文字符的字段中使用全文搜索時,不會得到正確的結果,原因在于中文中沒有像英文空格那樣對詞定界,不能以空格作為分割,對中文詞語進行索引。

            引用《MySQL 5.1參考手冊》中的一段話:
          引用
          12.7. 全文搜索功能(http://dev.mysql.com/doc/refman/5.1/zh/functions.html
          ● MySQL支持全文索引和搜索功能。MySQL中的全文索引類型FULLTEXT的索引。FULLTEXT 索引僅可用于 MyISAM 表;他們可以從CHAR、 VARCHAR或TEXT列中作為CREATE TABLE語句的一部分被創建,或是隨后使用ALTER TABLE 或 CREATE INDEX被添加。對于較大的數據集,將你的資料輸入一個沒有FULLTEXT索引的表中,然后創建索引, 其速度比把資料輸入現有FULLTEXT索引的速度更為快。

          ● FULLTEXT分析程序會通過尋找某些分隔符來確定單詞的起始位置和結束位置,例如' ' (間隔符號)、 , (逗號)以及 . (句號 )。假如單詞沒有被分隔符分開,(例如在中文里 ), 則 FULLTEXT 分析程序不能確定一個詞的起始位置和結束位置。為了能夠在這樣的語言中向FULLTEXT 索引添加單詞或其它編入索引的術語,你必須對它們進行預處理,使其被一些諸如"之類的任意分隔符分隔開。

          ● 諸如漢語和日語這樣的表意語言沒有自定界符。因此, FULLTEXT分析程序不能確定在這些或其它的這類語言中詞的起始和結束的位置。


            國內已有的MySQL中文全文索引解決方案有兩個:一是海量科技的MySQL5.0.37--LinuxX86-Chinese+,二是hightman開發的mysql-5.1.11-ft-hightman,兩者都是基于中文分詞技術,對中文語句進行拆分。但是,兩者都有弊端,一是不支持64位操作系統;二是對修改了MySQL源碼,只支持某一MySQL版本,不便于跟進新版本;三是詞庫不能做到很大很全,對于專業性質較強的數據庫內容(例如搜索“頤和園路東口”、“清華東路西口”等公交站點,“萊鎮香格里”、“碧海云天”等樓盤名稱),基于中文分詞的全文索引經常搜索不出來任何內容,即使添加分詞詞庫,也不會很全面。

            由于精準全文查詢的需要,我借鑒了二元交叉切分算法的思想,用自創的“三字節交叉切分算法”,寫出了這款“MySQL中文全文索引插件──mysqlcft 1.0.0”。由于開發時間倉促,難免存在未發現的問題,這將后續的版本中不斷完善。對于百萬條記錄的MySQL表進行全文檢索,mysqlcft已經夠用。



            Mysqlcft 網址:http://code.google.com/p/mysqlcft/

            Mysqlcft 作者:張宴



            一、MySQL中文全文索引插件mysqlcft的特點:
            1、優點:
           ?、?、精準度很高:采用自創的“三字節交叉切分算法”,對中文語句進行分割,無中文分詞詞庫,搜索精準度遠比中文分詞算法高,能達到LIKE '%...%"的準確率。
           ?、?、查詢速度快:查詢速度比LIKE '%...%"搜索快3~50倍,文章末尾有測試結果;
           ?、?、標準插件式:以MySQL 5.1全文索引的標準插件形式開發,不修改MySQL源代碼,不影響MySQL的其他功能,可快速跟進MySQL新版本;
           ?、?、支持版本多:支持所有的MySQL 5.1 Release Candidate版本,即MySQL 5.1.22 RC~最新的MySQL 5.1.25 RC;
           ?、?、支持字符集:支持包括GBK、GB2312、UTF-8、Latin1、BIG5在內的MySQL字符集(其他字符集沒有測試過);
           ?、?、系統兼容好:具有i386和x86_64兩個版本,支持32位(i386)和64位(x86_64)CPU及Linux系統;
           ?、?、適合分布式:非常適合MySQL Slave分布式系統架構,無詞庫維護成本,不存在詞庫同步問題。

            2、缺點:
           ?、?、mysqlcft中文全文索引只適用于MyISAM表,因為MySQL只支持對MyISAM表建立FULLTEXT索引;
           ?、?、MySQL不能靜態編譯安裝,否則無法安裝mysqlcft插件;
           ?、?、基于“三字節交叉切分算法”的索引文件會比海量、ft-hightman等基于“中文分詞算法”的索引文件稍大,但不是大很多。根據我的測試,mysqlcft全文索引的.MYI索引文件是.MYD數據文件的2~5倍。



            二、mysqlcft的核心思想──“三字節交叉切分算法”

            點擊在新窗口中瀏覽此圖片

            注:本文以0~7數字序號代表“英文”、“數字”和“半個漢字”,以便說明。
            1、按三字節對中文語句進行切分,建立全文索引:
            例如:“全文索引”或“1臺x光機”四個字會被交叉分拆為6份,建立反向索引:
            012  123  234  345  456  567

            2、按三字節對搜索的關鍵字進行切分,在全文索引中找出對應信息:
            例①:搜索關鍵字“文索”,用數字序號表示就是“2~5”,那么它將被切分成:
            234  345
            這樣,就與全文索引對上了。

            例②:搜索關鍵字“x光機”,用數字序號表示就是“3~7”,那么它將被切分成:
            345  456  567
            這樣,也與全文索引對上了。

            例③:搜索關鍵字“1臺 光機”,用數字序號表示就是“0~2”和“4~7”,那么它將被切分成:
            012  456  567
            這樣,多關鍵字搜索也與全文索引對上了。
          分頁: 1/1 第一頁 1 最后頁 [ 顯示模式: 摘要 | 列表 ]
          在线精品国产在线视频