一、 项目需求
开发一个轻量级搜索引擎项目,涉及分词,建索引,网页去重,计算相似度,文本聚类,前台页面展示,多进程编程,网络编程,守护进程编写,makefile编写,工程组织等各方面内容。
二、 开发环境
Linux操作系统下,C++开发
Server端:
Linux: centos6.6
G++: version 4.8
Browser端:
PHP
三、 项目目录组织
目录结构:
src://存放系统的源文件(.cpp)
include://存放系统的头文件(.h)
lib://存放系统程序中所使用的库文件
bin://存放系统的可执行程序
log://程序日志文件
conf://存放系统程序中所需的相关配置信息
data:存放系统程序所需的数据
Makefile://Makefile文件
读数据文件,要通过配置文件来读取,不要硬编码;
程序,启动,停止,重启,扫描,都需要写脚本;
四、系统总体概述
1.预处理过程:
预处理的过程主要生成程序所需的三个文件:网页库文件,网页位置信息文件和倒排索引文件。
其中网页库文件ripepage.lib主要是以格式化的数据存储大量的网页信息,每个网页的格式化数据为:< doc >< docid >id< /docid >< docurl >url< /docurl >< doctitle >title< /doctitle >< doccontent >content< /doccontent >< >< /doc >。
网页位置信息文件offset.lib主要是存放网页在网页库中的偏移位置,以便程序能快速的取出指定的网页,该文件每一行存储一个网页文件在网页库中的位置信息,每一行的格式为:docid offset size, 其中docid为网页的id(此id具有全局唯一性),offset为文档在网页库中距离文件起始位置的字节数,size为文档的大小。
倒排索引文件invert.lib为网页库中的所有词(经过分词,去停用词)与包含这些词的文档的一种关联关系。每个词的倒排索引在该文件中占一行,每一行的格式为:
Word docid1 frequency1 weight1 … docidi frequencyi weighti…
其中word为网页库中的词, 后面接着的是每三个为一组,docidi 为包含该词的网页,frequencyi为该次在该文档中的词频,weighti为该次在该文档中的权重(归一化后的)。
2.程序运行过程:
程序首先从offset.lib中读取网页位置信息,然后根据这些信息从rippage.lib中读取网页信息,然后从invert.lib读取倒排索引信息
程序循环不断地通过socket接受来自客户端的请求,一旦受到请求就fork一个子进程负责处理该请求而主进程则继续监听。子进程接受来自客户端的查询语句,根据查询语句查找结果并将结果返回给客户端。
3.系统运行图:
五、 项目模块划分
0. 组织项目结构
1. 建立网页库
2. 分词(主要是如何使用库文件)
3. 网页去重
4. 建立索引
5. 检索模块(相似度计算)
6. 网络IO库的建立及使用
六、 项目模块需求描述
0.组织项目结构,编写基本的makefile,配置文件, 设计系统的框架
组织目录结构,编写配置文件,编写基本的makefile
配置文件名字:search.conf
Conf文件格式
< Data >
Page_file = ../data/page.lib
Stopword_file = ../data/stoplist.txt
…….
< Socket >
Port=54321
设计系统的框架,设计项目中需要的类文件
相关类及其说明:
Class MyConf
数据成员:
Map< string, string > m_map :存放配置文件内容(配置文件是以 Key – Value 的形式存储)。
Vector< pair< string, string > > m_vec : 存放词典文件的内容。(词典文件是以 word frequence 的形式存储,且文件的编码为GBK编码) 。
Map< string, set < int > > m_index : 存放包含一个字符或者汉字的词在m_vec中的位置(下标)。
Ifstream fin : 用来关联配置文件的文件流 。
主要的函数成员:
MyConf(const string& name ):带参数的构造函数,在创建该类的对象的时候一定要传递一个文件名。
Void index_to_map(int &i , map< string, set< int > > & m_map) ; 将m_vec 中第i个位置上的pair 中的 first
元素 映射到索引 m_index 。
Map< string, string >& get_map() ; 获取存放配置文件内容的关联容器 m_map 。
Class MyLock
数据成员:
Pthread_mutex_t m_mutex : 互斥信号量。
主要的函数成员:
Lock() :获得互斥量(上锁)
Unlock(): 解锁 。
Class MyCondition
数据成员:
Pthread_mutex_t& m_mutex : 互斥信号量的引用 <