關鍵詞匹配項目深入研究(一) - 過濾器的引入
在開始看本篇時,請先了解 手把手教你做關鍵詞匹配項目(搜索引擎)---- 第一天 ~ 手把手教你做關鍵詞匹配項目(搜索引擎)---- 第二十二天
前言
接上回說到,小帥帥把完成后的代碼,以及測試結果給出來后,于老大也沒多說什么,就被要求上線了,原因很簡單:大家都想有點貢獻,福利也是少不了的,后期遇到的事情后期再來升級,那餐飯,小帥帥很happy,很滿足,當然同行的有小丁丁,于老大,王總監。
問題的前因
隨著項目的運行,采集關鍵詞的應用日益廣泛,突然有一天小丁丁跑來找到小帥帥,小帥帥當然很歡喜,但是聽到后面的對話涼了一大截。
“小帥帥,你看,這些詞怎么有&,?,%,好多亂七八糟的詞都有了,這些詞都不太合適用,幫幫忙看看怎么去掉咯。”小丁丁的眼神也夠厲害的,盯得小帥帥直哆嗦。
“大姐,好咯,我先去瞧瞧,這件事包在我身上,到時解決了跟你說聲”。
小帥帥回去查了下,發現數據庫里面好多這種古怪的詞,小帥帥慌了,只好又去找到于老大。
“現在詞庫關鍵詞里面包含&,?,%這種詞很多,而且根據匹配度算法來算的話,這些詞都是可用的,我們怎么辦?”。
于老大聽了小帥帥的解說,想出了一個方案,我們控制下這些關鍵詞咯,反正這些關鍵詞業務也不使用,我們就不要讓他入庫了,既可以減少關鍵詞庫的量,又能保證關鍵詞的可利用率高。
小帥帥一聽,于老大就是不一樣,望塵莫及。
解決方案
增加一個功能,控制詞源入庫,符合規則的準入,不符合規則的丟棄--過濾器的功能。
設計方案
升級版果斷多姿多彩。
類圖:
代碼方案
1. InputSource、FileSource、TaobaoHotsSource代碼不變。
2. Source代碼新增過濾代碼,如下:
1 class Source { 2 3 public $keyWords; 4 5 public function run() { 6 7 foreach ($this->keywords as $word) { 8 # code... 9 if(Filter::is($word)) continue;10 11 $keyword = new Keyword();12 $keyword->word = $word;13 $keyword->save();14 }15 }16 17 }3. 新增Filter代碼:
1 <?php 2 3 #@Filename: filter/Filter.php 4 #@Author: oShine 5 6 class Filter { 7 8 PRivate static $filterWords = array("*","?","%",".","&"); 9 10 public static function is($word){11 $pattern = "/(".implode("|", self::$filterWords).")/";12 return preg_match(pattern, $word);13 }14 15 }
總結
良好的代碼結構,新增移除功能都非常簡單,工作效率提升了。小帥帥深深的愛上了這份工作。
新聞熱點
疑難解答