0

0

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

php中文网

php中文网

发布时间:2016-06-13 12:12:44

|

908人浏览过

|

来源于php中文网

原创

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

(二)分表思想的引入

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

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

 

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

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

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

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

本篇正文正式开始。

问题的前因

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

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

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

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

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

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

STORYD
STORYD

帮你写出让领导满意的精美文稿

下载

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

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

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

解决方案

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

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

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

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

实现方案

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

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

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

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

相关专题

更多
php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

4

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

7

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

42

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

4

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

3

2025.12.31

阻止电脑自动安装软件教程
阻止电脑自动安装软件教程

本专题整合了阻止电脑自动安装软件教程,阅读专题下面的文章了解更多详细教程。

3

2025.12.31

html5怎么使用
html5怎么使用

想快速上手HTML5开发?本合集为你整理最实用的HTML5使用指南!涵盖HTML5基础语法、主流框架(如Bootstrap、Vue、React)集成方法,以及无需安装、直接在线编辑运行的平台推荐(如CodePen、JSFiddle)。无论你是新手还是进阶开发者,都能轻松掌握HTML5网页制作、响应式布局与交互功能开发,零配置开启高效前端编程之旅!

2

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
动力节点mysql基础视频教程
动力节点mysql基础视频教程

共86课时 | 18.1万人学习

Web Services教程
Web Services教程

共6课时 | 4.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号