关键词匹配项目深入研究(二)- 分表思想的引入

(二)分表思想的引入

近期的文章: 1)高并发数据采集的架构应用(Redis的应用)

                    2)高可用数据采集平台(如何玩转3门语言php+.net+aauto)

手把手教你做关键词匹配项目这块基本已经完成,深入研究是对系统的性能作为分析,在一些环境的刺激下所必需要做的一些改变。

手把手教你做关键词匹配项目: 手把手教你做关键词匹配项目(搜索引擎)---- 第一天~手把手教你做关键词匹配项目(搜索引擎)---- 第二十二天 (共22篇)

深入研究:上节讲到 关键词匹配项目深入研究-过滤器的引入

每一篇会分为问题的前因解决方案以及有些必要的实现方案

本篇正文正式开始。

问题的前因

        随着自动采集数据的爆炸式的增长,词库的容量蒸蒸日上,一下从几W数据猛增几百万数据,小帅帅看着数据库的查询越来越感到无能为力。

再加上小丁丁常对小帅帅说的最多的一句:何时那么选词能快一点,每次我都等好久都莫有反应,真是急死我了。

小帅帅也比较焦急,心力憔悴,真正的感觉到原来这就是挑战。小帅帅无可奈何的继续找到于老大,求于老大赏赐高招。

于老大拍拍小帅帅的肩膀:小伙子,知道项目的难度了吧!

小帅帅回答道:别挖苦我了,我已深深的感受到了,我想我心脏估计快承受不了了。

于老大:就这点你就承受不了,那估计以后有的是给你受的。

小帅帅:大哥,别说这些虚的行不,赶紧的解决方案丫。

于老大:急啥,事情是急不来的,过来,哥给你指条明路。

“每个宝贝是不是有类别的属性,那么这几百万数据真正属于这个类别的词能够有多少?假设我们只取这个类别的词库我们的项目是否可以继续稳定下来”。

解决方案

        按照某种业务需要,我们可以对数据表实行分割,可以纵向或者横向分割,可以有效的进行性能优化。

纵向分割也称列分割,把不常用的列或者长字段分割来保证实体处于一个相对适用的状态,常见的有一对一关联。

横向分割也称行分割,按照某种业务拆分数据的记录来存放在不同的表,常见的有按日期分表操作。

本案例是使用横向分割,把数据按照类别的形式进行拆分。

实现方案

        我们为了不更改数据表的结构,这样设计了,我们按照表名来区分项目使用那个数据表。这样一来的改动相对是非常少的。我们只需稍微改动下代码就可以解决了,这很心塞的一件事情。

修改Keyword的代码,增加获取数据源。

<?php
define(‘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 oShine
define(‘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:oshine

require_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);
    }
}

总结
      小帅帅又学到了新的知识点,这是要犒劳于老大的节奏吗?你们是否也要犒劳下我呢,求赞哈!

时间: 2024-10-23 08:22:21

关键词匹配项目深入研究(二)- 分表思想的引入的相关文章

关键词匹配项目深入研究-过滤器的引入

关键词匹配项目深入研究(一) - 过滤器的引入 在开始看本篇时,请先了解 手把手教你做关键词匹配项目(搜索引擎)---- 第一天 ~ 手把手教你做关键词匹配项目(搜索引擎)---- 第二十二天 前言 接上回说到,小帅帅把完成后的代码,以及测试结果给出来后,于老大也没多说什么,就被要求上线了,原因很简单:大家都想有点贡献,福利也是少不了的,后期遇到的事情后期再来升级,那餐饭,小帅帅很happy,很满足,当然同行的有小丁丁,于老大,王总监. 问题的前因 随着项目的运行,采集关键词的应用日益广泛,突然

手把手教你做关键词匹配项目(搜索引擎)---- 第二十一天

客串:屌丝的坑人表单神器.数据库那点事儿 面向对象升华:面向对象的认识----新生的初识.面向对象的番外----思想的梦游篇(1).面向对象的认识---如何找出类 负载均衡:负载均衡----概念认识篇.负载均衡----实现配置篇(Nginx) 吐槽:现在欠的文章有面向对象的认识----类的转化.面向对象的番外---思想的梦游篇(2).负载均衡 ---- 文件服务策略.手把手教你做关键词匹配项目(搜索引擎).真心太多了,能不能让我休息一会儿. 第二十一天 起点:手把手教你做关键词匹配项目(搜索引擎

手把手教你做关键词匹配项目(搜索引擎)---- 第七天

第七天 小帅帅拿回去仔细研究了一个晚上. 发现代码其实都是自己写的,就多了一些类,于老大还不是抄的我的代码,心里又鄙视了于老大一番. 其实每个人都有通病,写过程的总是会鄙视写面向对象的,因为他们没体会到面向对象是啥玩意,要让他们写好可得花上好几年的工夫. 小帅帅学编程的时候,明明知道有函数这一概念,知道函数的写法,但是实际上就算一个函数里面几百行代码,也不知道去提前多个函数出来,美其名约:你看我多厉害,几百行代码耶. 小帅帅心里虽然鄙视于老大,但是看到于老大的代码怎么感觉很清爽,一切都那么自然.

手把手教你做关键词匹配项目(搜索引擎)---- 第八天

第八天 话说小帅帅自从走进了淘宝开放平台这个迷雾森林,感觉这迷雾森林好大,正当他无所适从的时候. 一位悦耳动听的声音响起来了,甜甜的声音说道:亲,想通过这片森林吗,我将指引你前进. 小帅帅一听,那种感觉,身体不由自主的跟随这声音而去,突然一道强光闪过,啊..... 小帅帅惊醒了.小帅帅一看时间,我滴个天,这么晚了.就这样小帅帅从业一来第一次迟到. 其实小帅帅在平台里面琢磨了一个晚上,整个晚上其实也没琢磨个啥出来. 正当要到公司的时候,手机的铃声响起来了,一看是于老大的电话,接通电话. 于老大问候

手把手教你做关键词匹配项目(搜索引擎)---- 第三天

第三天 小王(运营总监)看到小丁丁整天都在淘宝.百度.魔方.拍拍上面淘关键词,每天花费的时间好长,工作效率又低,拿着这个借口来找到我. 说到:小帅帅,你看小丁丁每天都在淘宝.百度.魔方.拍拍上面淘关键词花费的时间好长,你能不能帮帮忙,看看能不能让系统自己做啦,这样可以节省好多人力,带来的效益多高.(0 其实就是为了掩饰他们懒惰 0) 小帅帅一听到可以带来的效益好高,王总还求着我呢 ,马上 两眼冒着星光,是该好好体现, 解决这个问题就可以体现出我的价值. 小帅帅拍着胸膛保证到:王总,这个小KS啦,

手把手教你做关键词匹配项目(搜索引擎)---- 第六天

第六天 小帅帅周五休息后,精神估计太旺盛了,周末两天就狂欢去了,酒喝高了,把一件重要的事儿给忘记了. 周一重新整装 刺骨上战场. 一来公司,小帅帅终于记得他要做的事情,就迫不及待的整理会议报告(工作总结). 1.上周工作任务: 1) 页面提交关键词到关键词词库 2) 文件导入到关键词词库 3) 自动抓取关键此到关键词词库 2.能力的提升 1) 学会了如何读csv文件 2)  学会了curl 3)  学会了Html Dom parse 3.下周工作任务: 1) 了解下关键词词库的应用 刚写到这儿,

手把手教你做关键词匹配项目(搜索引擎)---- 第一天

第一天 收到需求,需求如下: 1. 收集关键词,构建关键词词库. 收到这个任务,第一想法,这还不简单吗? 马上动手创建一个关键词录入界面,保存到数据库. 第一步完成了,哈哈大笑了一天,没想到事情原来如此的简单. $keywords = $_POST["keywords"]; foreach($keywords as $keyword) { #save $keyword to database .............. } 手把手教你做关键词匹配项目(搜索引擎)---- 第一天

手把手教你做关键词匹配项目(搜索引擎)---- 第九天

第九天 回顾: 8. 手把手教你做关键词匹配项目(搜索引擎)---- 第八天 7. 手把手教你做关键词匹配项目(搜索引擎)---- 第七天 6. 手把手教你做关键词匹配项目(搜索引擎)---- 第六天 5. 手把手教你做关键词匹配项目(搜索引擎)---- 第五天 4. 手把手教你做关键词匹配项目(搜索引擎)---- 第四天 3. 手把手教你做关键词匹配项目(搜索引擎)---- 第三天 2. 手把手教你做关键词匹配项目(搜索引擎)---- 第二天 1. 手把手教你做关键词匹配项目(搜索引擎)---

手把手教你做关键词匹配项目(搜索引擎)---- 第十五天

第十五天 小帅帅很乐意做简单的事情,复杂的事情他搞不懂怎么做,但是听了于老大的讲解,他觉得好多事情怎么这么简单. 他随手把一些代码写了出来,然后去找于老大,去请教以后怎么做...... <?php class OldAgeCharListHandle extends CharListHandle{ public function exec(){ $this->charlist->addCore("老年"); $this->charlist->addBlac