關鍵詞匹配項目深入研究(一) - 過濾器的引入
在開始看本篇時,請先了解 手把手教你做關鍵詞匹配項目(搜索引擎)---- 第一天 ~ 手把手教你做關鍵詞匹配項目(搜索引擎)---- 第二十二天
前言
接上回說到,小帥帥把完成後的代碼,以及測試結果給出來後,於老大也沒多說什麼,就被要求上線了,原因很簡單:大家都想有點貢獻,福利也是少不了的,後期遇到的事情後期再來升級,那餐飯,小帥帥很happy,很滿足,當然同行的有小丁丁,於老大,王總監。
問題的前因
隨著項目的運行,采集關鍵詞的應用日益廣泛,突然有一天小丁丁跑來找到小帥帥,小帥帥當然很歡喜,但是聽到後面的對話涼了一大截。
“小帥帥,你看,這些詞怎麼有&,?,%,好多亂七八糟的詞都有了,這些詞都不太合適用,幫幫忙看看怎麼去掉咯。”小丁丁的眼神也夠厲害的,盯得小帥帥直哆嗦。
“大姐,好咯,我先去瞧瞧,這件事包在我身上,到時解決了跟你說聲”。
小帥帥回去查了下,發現數據庫裡面好多這種古怪的詞,小帥帥慌了,只好又去找到於老大。
“現在詞庫關鍵詞裡面包含&,?,%這種詞很多,而且根據匹配度算法來算的話,這些詞都是可用的,我們怎麼辦?”。
於老大聽了小帥帥的解說,想出了一個方案,我們控制下這些關鍵詞咯,反正這些關鍵詞業務也不使用,我們就不要讓他入庫了,既可以減少關鍵詞庫的量,又能保證關鍵詞的可利用率高。
小帥帥一聽,於老大就是不一樣,望塵莫及。
解決方案
增加一個功能,控制詞源入庫,符合規則的准入,不符合規則的丟棄--過濾器的功能。
設計方案
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 }
總結
良好的代碼結構,新增移除功能都非常簡單,工作效率提升了。小帥帥深深的愛上了這份工作。