基於lucene.net的網站標籤系統設計

      標籤系統是目前網站中比較流行的一種數據分類方式,通過設置在網站文章或貼子上的標籤屬性,可以向用戶立體的多方位的展示信息,其好處是不言而諭的,看看豆瓣、Discuz!、qq空間吧,這裏不再贅述。一般來說標籤系統需要提供兩個功能,第一個當然就是根據標籤來搜索了,另一個就是自動從文章提取標籤,這個功能可以看看qq空間,Discuz!不支持這個功能,下面就從這兩個方面來闡述一下我的設計方案。
自動提取標籤功能,分析了qq空間的功能,基本思路是先分詞,然後計算每一個詞在文章中出現的頻率,根據系統中存在的熱門標籤來計算每一個詞的推薦分值,至於公式可以根據自己的需要自己定義,我的公式是:每個詞的頻率/所有詞的頻率的和 * 40% + 該詞在熱門標籤中的熱度*60%,熱度計算公式:每個熱門標籤的頻率/所有熱門標籤頻率的和。經過計算的分值倒敘排序後就可以算出推薦的標籤。中文分詞的算法有很多種,可以選擇lucene自帶的分詞器,它是基於二分法的,準確率不高,我推薦使用的中科院的免費版,它的準確率和速度都是不錯的,代碼可以免費得到,我做了些修改:收集了中英文停詞,一次性導入詞庫,刪除了所有監控事件,提高效率。熱門標籤的熱度計算可以採用異步形式,每一個小時計算一次,計算結果保存到內存裏,計算步驟如下:1、根據數據庫保存的標籤數據,數據庫設計時要保存每個標籤和文章的數據對,比如ID,標籤。2、分組統計每一個標籤出現的次數,按次數倒序排序後,取前1000個。3、以key/value的形式保存到內存,可以hashtable的方式直接保存到當然網站系統內存,也可以保存到memcached中。
      建立標籤索引,一般來說自動提取的標籤多多少少會不符合用戶的需要,所以要提供手動修改的功能,符合要求的標籤需要被全文索引後才能被搜索,建立索引需要使用lucene提供的IndexWriter類,不過需要我們自己提供標籤分詞工具,我採用的索引是以逗號分割的,所以自己繼承的Analyzer也很簡單,直接採用split方法分割就可以了。爲了提高標籤建立的效率,可以參用先使用RAMDirectory在內存索引在一次性寫入磁盤文件的方式,這樣效率會提高很多,我測試的,100萬條數據的速度可以相差10幾倍。
      標籤查詢,查詢就簡單了,直接採用lucene的語法就可以了,lucene的查詢語法可以在官網上查到,支持bool,與、或、非、range等,lucene也可以支持根據字段排序,比如根據時間排序,排序會影響效率,本機測試,帶排序的100萬條數據需要1.4秒,而不排序只需要70幾毫秒,一般我們的用法可以加上時間範圍,去一段時間內的數據再排序,這樣會提高效率。
綜述,使用lucene來查詢比使用mysql數據庫查詢效率會提高很多,在50萬條數據以內是毫秒級的,這對一般的小網站已經是足夠了,希望這篇文章可以拋磚引玉。

發佈了27 篇原創文章 · 獲贊 1 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章