国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

關(guān)鍵詞匹配項(xiàng)目深入研究(二)- 分表思想的引入

2019-11-15 02:00:38
字體:
供稿:網(wǎng)友
關(guān)鍵詞匹配項(xiàng)目深入研究(二)- 分表思想的引入

(二)分表思想的引入

近期的文章: 1)高并發(fā)數(shù)據(jù)采集的架構(gòu)應(yīng)用(Redis的應(yīng)用)

2)高可用數(shù)據(jù)采集平臺(tái)(如何玩轉(zhuǎn)3門語言php+.net+aauto)

手把手教你做關(guān)鍵詞匹配項(xiàng)目這塊基本已經(jīng)完成,深入研究是對(duì)系統(tǒng)的性能作為分析,在一些環(huán)境的刺激下所必需要做的一些改變。

手把手教你做關(guān)鍵詞匹配項(xiàng)目: 手把手教你做關(guān)鍵詞匹配項(xiàng)目(搜索引擎)---- 第一天~手把手教你做關(guān)鍵詞匹配項(xiàng)目(搜索引擎)---- 第二十二天 (共22篇)

深入研究:上節(jié)講到 關(guān)鍵詞匹配項(xiàng)目深入研究-過濾器的引入。

每一篇會(huì)分為問題的前因解決方案以及有些必要的實(shí)現(xiàn)方案

本篇正文正式開始。

問題的前因

隨著自動(dòng)采集數(shù)據(jù)的爆炸式的增長,詞庫的容量蒸蒸日上,一下從幾W數(shù)據(jù)猛增幾百萬數(shù)據(jù),小帥帥看著數(shù)據(jù)庫的查詢?cè)絹碓礁械綗o能為力。

再加上小丁丁常對(duì)小帥帥說的最多的一句:何時(shí)那么選詞能快一點(diǎn),每次我都等好久都莫有反應(yīng),真是急死我了。

小帥帥也比較焦急,心力憔悴,真正的感覺到原來這就是挑戰(zhàn)。小帥帥無可奈何的繼續(xù)找到于老大,求于老大賞賜高招。

于老大拍拍小帥帥的肩膀:小伙子,知道項(xiàng)目的難度了吧!

小帥帥回答道:別挖苦我了,我已深深的感受到了,我想我心臟估計(jì)快承受不了了。

于老大:就這點(diǎn)你就承受不了,那估計(jì)以后有的是給你受的。

小帥帥:大哥,別說這些虛的行不,趕緊的解決方案丫。

于老大:急啥,事情是急不來的,過來,哥給你指條明路。

“每個(gè)寶貝是不是有類別的屬性,那么這幾百萬數(shù)據(jù)真正屬于這個(gè)類別的詞能夠有多少?假設(shè)我們只取這個(gè)類別的詞庫我們的項(xiàng)目是否可以繼續(xù)穩(wěn)定下來”。

解決方案

按照某種業(yè)務(wù)需要,我們可以對(duì)數(shù)據(jù)表實(shí)行分割,可以縱向或者橫向分割,可以有效的進(jìn)行性能優(yōu)化。

縱向分割也稱列分割,把不常用的列或者長字段分割來保證實(shí)體處于一個(gè)相對(duì)適用的狀態(tài),常見的有一對(duì)一關(guān)聯(lián)。

橫向分割也稱行分割,按照某種業(yè)務(wù)拆分?jǐn)?shù)據(jù)的記錄來存放在不同的表,常見的有按日期分表操作。

本案例是使用橫向分割,把數(shù)據(jù)按照類別的形式進(jìn)行拆分。

實(shí)現(xiàn)方案

我們?yōu)榱瞬桓臄?shù)據(jù)表的結(jié)構(gòu),這樣設(shè)計(jì)了,我們按照表名來區(qū)分項(xiàng)目使用那個(gè)數(shù)據(jù)表。這樣一來的改動(dòng)相對(duì)是非常少的。我們只需稍微改動(dòng)下代碼就可以解決了,這很心塞的一件事情。

修改KeyWord的代碼,增加獲取數(shù)據(jù)源。

<?phpdefine('DATABASE_HOST','127.0.0.1');define('DATABASE_USER','xiaoshuaishuai');define('DATABASE__PASSWORD','xiaoshuaishuai');define('DATABASE_CHARSET','utf-8');class Keyword {    public $word;    public static $conn = null;    public function getDbConn(){        if(self::$conn == null){            self::$conn = MySQL_connect(DATABASE_HOST,DATABASE_USER,DATABASE__PASSWORD);            mysql_query("SET NAMES '".DATABASE_CHARSET."'",self::$conn);            mysql_select_db("dict",self::$conn);            return self::$conn;        }        return self::$conn;    }    public function save(){        $sql = "insert into keywords(word) values ('$this->word')";        return mysql_query($sql,$this->getDbConn());    }    public static function getWordsSource($cid,$limit=0,$offset=40){        $sql = "SELECT * FROM keywords_$cid LIMIT $limit,$ffset";        return DB::MakeArray($sql);    }    public static function getWordsCount($cid){          $sql = "SELECT count(*) FROM keywords_$cid";        return DB::QueryScalar($sql);    }}

DB類新增QueryScalar,用于算總量

<?php#@author oShinedefine('DATABASE_HOST','127.0.0.1');define('DATABASE_USER','xiaoshuaishuai');define('DATABASE__PASSWORD','xiaoshuaishuai');define('DATABASE_CHARSET','utf-8');class DB {    public static $conn = null;    public static function Connect(){        if(self::$conn == null){            self::$conn = mysql_connect(DATABASE_HOST,DATABASE_USER,DATABASE__PASSWORD);            mysql_query("SET NAMES '".DATABASE_CHARSET."'",self::$conn);            mysql_select_db("dict",self::$conn);            return self::$conn;        }        return self::$conn;    }    public static function Query($sql){       return mysql_query($sql,self::Connect());    }    public static function makeArray($sql){        $rs = self::Query($sql);        $result = array();        while($data = mysql_fetch_assoc($rs)){            $result[] = $data;        }        return $result;    }    public static function QueryScalar($sql){         $rs = self::Query($sql);         $data = mysql_fetch_array($rs);         if($data == false || empty($data) || !isset($data[1])) return 0;         return $data[1];    }} 

修改Selector的代碼,用于選詞:

<?php#@Filename:selector/Selector.php#@Author:oshinerequire_once dirname(__FILE__) . '/SelectorItem.php';require_once dirname(__FILE__) . '/charlist/CharList.php';require_once dirname(__FILE__) . '/charlist/CharlistHandle.php';require_once dirname(dirname(__FILE__)) . '/lib/Logger.php';class Selector{    PRivate static $charListHandle = array(        "黑名單" => "BacklistCharListHandle",        "近義詞" => "LinklistCharListHandle"    );    public static function select($num_iid)    {        $selectorItem = SelectorItem::createFromApi($num_iid);        Logger::trace($selectorItem->props_name);        $charlist = new CharList();        foreach (self::$charListHandle as $matchKey => $className) {            $handle = self::createCharListHandle($className, $charlist, $selectorItem);            $handle->exec();        }        $selectWords = array();        $wordsCount = Keyword::getWordsCount(selectorItem->cid);        $offset = 40;        $page =  ceil($wordsCount/$offset);        for($i=0;$i<=$page;$i++){            $limit = $i*$offset;            $keywords = Keyword::getWordsSource(selectorItem->cid,$limit,$offset);             foreach ($keywords as $val) {                # code...                $keywordEntity = SplitterApp::split($val["word"]);                                    # code...                if(MacthExector::macth($keywordEntity,$charlist)){                    $selectWords[] = $val["word"];                }                      }        }        return $selectWords;    }    public static function createCharListHandle($className, $charlist, $selectorItem)    {        if (class_exists($className)) {            return new $className($charlist, $selectorItem);        }        throw new Exception("class not exists", 0);    }}

總結(jié) 小帥帥又學(xué)到了新的知識(shí)點(diǎn),這是要犒勞于老大的節(jié)奏嗎?你們是否也要犒勞下我呢,求贊哈!


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 栾川县| 阿图什市| 广安市| 金门县| 刚察县| 滦平县| 五常市| 高州市| 民乐县| 宝丰县| 涟源市| 罗江县| 吐鲁番市| 法库县| 错那县| 桃源县| 雷波县| 大丰市| 新营市| 中江县| 中阳县| 蓬溪县| 栖霞市| 湖口县| 万州区| 沿河| 永济市| 丰城市| 汪清县| 宝山区| 易门县| 德钦县| 西青区| 汉中市| 瑞丽市| 浮梁县| 罗城| 松溪县| 松溪县| 乌兰浩特市| 无为县|