Posted on 2009-09-30 00:11
創意恒動力 閱讀(1072)
評論(0) 編輯 收藏

先介紹一下工具吧:
Sphinx :Sphinx是一個基于SQL的全文檢索引擎,可以結合MySQL,PostgreSQL做全文搜索,它可以提供比數據庫本身更專業的搜索功能,使得應用程序更容易實現專業化的全文檢索。Sphinx特別為一些腳本語言設計搜索API接口,如PHP,Python,Perl,Ruby等,同時為MySQL也設計了一個存儲引擎插件。
下載方式:http://www.sphinxsearch.com/
基于sphinx的coreseek:http://www.coreseek.cn/
中文分詞工具:LibMMSeg:http://www.coreseek.cn/opensource/mmseg/
tokyocabinet:在我第一篇博客有詳細介紹。
mysql:大家都熟悉的開源數據庫。
這個輕量級框架,保守估計,可以支持5線程同時并發搜索,根據我自己測試的結果,tokyocabinet(下稱tc )FIFO隊列返回10w條數據,只需要10ms,100w條數據要100ms左右。tc的key-value方式緩存,保守估計,100w條數據100ms沒問題。
介紹一下流程主要部分吧(看圖流程,比較像張宴的“億萬級搜索框架”,老實說當時我看過,只是表面了解一下 | 恕我冒犯,大師級的東東我不是很懂,圖片漂亮,但是內部實現,根本是比較模糊的,算是一半原創吧,哈哈)。
1、程序入口會判斷用戶輸入的關鍵字是否有關鍵字緩存,如果不存在,就會調用sphinx對mysql數據庫進行全文檢索。
然后sphinx會吧搜索索引的文檔id結果緩存到tc。
我故意把數據庫的文本結果緩存到FiFo隊列。因為sphinx是不會做文本索引的,所以它返回的知識搜索索引的文檔id,也就是數據庫主鍵id(或用戶自定義ID),程序必須要吧結果id放到數據庫搜索,吧文本結果取出來。雖然mysql根據id返回搜索結果的速度很快,(如果單用int類型id以遞增方式查詢mysql數據庫,每秒可處理1000w數據)。但實際不會這么用。所以文本結果緩存就顯得格外重要了。
最后通過FIFO隊列,把相同關鍵字的搜索結果返回到頁面現實。
2、當然,如何關鍵字緩存存在,就會直接從FIFO隊列返回搜索結果。
我的想法:
因為知道sphinx的缺陷,所以想盡辦法彌補,一個基于mysql的全文檢索工具,速度之快,很是讓人佩服。
問題總結:
1、簡單統計: 用了tc緩存,其實有很大一部分原因是用來做統計。很多搜索引擎,都是用mencache,但是mencache是建立在內存上面的,不釋放的話,資源消耗頗大。而tc就不一樣,它是寫入文本的,緩存數據得以保存。在做簡單統計的時候,比如說:
統計"java" 跟"C語言"的用戶搜索情況,我可以從tc中讀出關鍵詞緩存,知道搜索密度情況。
2、完成復雜統計: 復雜統計的話,必須要定義好,復雜的sql語句,要用到left join這樣那樣的函數,配置比較麻煩。但問題依然可以解決。(說是這么說,但是具體怎么做頭緒還差一丁點~~牽扯到多表查詢,性能如何還是要嘗試嘗試~)
希望看過文章的可以給點意見,我努力完善,獻丑啦~~
文章來源:http://henry2009.javaeye.com/blog/465834(我的舊博客)