⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 web搜索引擎设计和实现分析.txt

📁 几个Internet网络编程的资料和源码
💻 TXT
📖 第 1 页 / 共 2 页
字号:
char *basic_auth; //进行基本的HTTP认证
int proxy_port; //代理的端口号
int period; //再次索引的周期
int net_errors; //网络连接不通的次数
int max_net_errors; //可以允许的最大的网络错误
int read_timeout; //下载文件允许的最大的延迟
int maxhops; //表示URL可以最大跳转的深度
int userobots; //是否遵守robot.txt中的约定
int bodyweight; // 在< body >....< /body >之间的单词的权重
int titleweight; // 在< title >....< /title >之间的单词的权重
int urlweight; // 在文档的URL中的单词的权重
int descweight;//在 < META 
NAME="Description" Content="..." >之间单词的权重
int keywordweight; //在< META NAME="Keywords" Content="..." >
之间的单词的权重

---- 主要方法有: 
FindServer();//用来查找该服务器是否存在并可以连接
FillDefaultAttribute() //用来针对所有的WWW服务器填写默认的属}; 

以上的对象中的成员变量是和一个站点相关的参数的设置,我们对所有的站点有一个
默认的设置,但是可以对某些站点做一些特殊的设置。这些设置可以在配置文件中设定。 
---- 下面是关于文档的结构的主要的数据成员: 

Class CNetDocument
主要属性有:
int url_id; //该URL的ID号
int status; //获取该文档时候的状态
int size; //文档的尺寸
int tag; //和该文档相关的标签,表示该文档是
HTML,TEXT或者是其他类型
int hops; //URL跳转的次数
char *url; //和该文档相关的URL的名称
char *content_type; //该内容的类型
char *last_modified; //最近一次的更新时间
char *title; //该文档的标题
char *last_index_time; //上次索引的时间
char *next_index_time; //下次索引的时间
char *keywords; //该文档中的关键字
char *description; //该文档的描述

主要方法有:
FillDocInfo(…) //根据数据库,得到该文档相关信息
AddHerf(…) //加入网页中存在的新的链接的网址
DeleteURL(…) //删除一个存在的网址
CanGetThisURL(…) //根据配置决定是否去得到该网页
//下面三个方法是根据不同的URL,用不同的协议去获得文档
NNTPGet(…) 
FTPGet(….)
HTTPGet(….)
ParseHead(…) //如果是HTTP协议得到的话,分析头信息
ParseMainBody(…) //对获得的文档的主体进行分析
ServerResponseType (….) //得到服务器端的响应消息
UpdateURLDB(….) //更新的数据入库
} ;

---- 事实上,我们在要提取一个网页的时候,都要建立一个CNetDocument对象,然
后再对这个网页进行分析的时候,把相关的内容放到这个CNetDocument的成员变量里
面。下面是关于页面全文索引的结构的主要数据成员: 
Class CIndexer {
主要属性有:
char *url; //我们要处理的文档相关的URL的名称
int mwords; // 我们事先设定的一个网页的最大的单词数目
int nwords; // 实际的得到的单词的数目
int swords; // 我们已经排序的单词的数目
WORD *Word; //所有单词的内容
char *buf; //我们为文档所分配的空间
主要方法有:
InitIndexer(…) //进行初始设置和分配
ParseGetFile(…) //对得到的网页进行全文索引
AddWord(…) //把网页的可以索引的单词加到Word数组中去
InToDB(….) //关于网页全文索引的信息入库
};

---- 进行网页提取前,我们要建立一个CIndexer对象,它主要是用来对网页进行
全文的索引。一般来说我们只对两种类型的URL进行全文索引,一个是text/html,
另外一个是text/plain。其中WORD的数据结构如下: 
typedef struct word_struct {
int count; //该单词出现的次数
int code; //该单词的正常的形式,
比如单词可能为 encouraging,它的正常的形式应该为
encourage,这其实是一种对单词的stem。
即我们只取单词的主干部分。
char *word; //该单词的内容
} WORD;

---- 以下的结构是和网页中的一些链接的对象相关的一个数据结构 
typedef struct href_struct {
char *href; //该链接的名称
int hops; //发生的跳转次数
int stored; //是否已经存储到数据库中
} HREF;


---- 所有需要更新的和新产生的URL都被放到这个结构中,当它的数量超过一定
的范围以后,被一次性的存入数据库。 
---- 关于URL的一个数据结构如下: 

typedef struct url {
char *schema; //表示该URL是通过什么协议得到的,比如HTTP, 
FTP,NNTP等。
char *specific; //主机的名称加上路径
char *hostinfo; //主机的名称加上相关的协议端口
char *hostname; //主机的名称
char *path; //在主机的具体的路径
char *filename; //文件的名称
char *anchor; //相关的anchor
int port; //协议相关的端口
} URL;

---- 这是针对URL的一些相关的属性的描述的一个数据结构。事实上在数据库中,
我们存储的只是对网页的描述和对一些文本和HTML页面的关键词的索引信息。我们
并不存储网页的实际的内容。 
---- 三、用户查询实现描述 

---- 关于对用户提交的查询请求的实现分析: 

---- 用户想要查询某一方面的信息一般都是通过提供和该领域相关的几个关键字来进行的。

---- 我们来看一下关于用户查询的相关的数据结构和类: 

---- 下面是一个关于单词和它的权值的基本结构: 

typedef struct word_weight_pair
{
char word[WORD_LEN];
int weight;
}word_weight_pair;


---- 下面的类主要是用来对用户的查询进行处理和分析: 
Class CUserQuery
{
char m_UserQuery[MAX_QUERYLEN]; //用户的查询表达式
CPtrArray word_weight_col; 
//是关于结构word_weight_pair的动态数组
int m_maxReturnSum; //用户希望返回的最多的网页数
int search_mode;
CObArray m_returnDoc; //是关于CNetDocument对象的一个动态数组
NormalizeWord(char* OneWord); //对单词进行归整化,即Stem.
Find(char* odbcName); //进行数据库查找和匹配
};

---- 系统实现的基本的步骤如下: 

---- 1.对用户输入的查询表达式进行分析。事实上,我们在前面的Spider搜索过
程中对文档的表示是通过关键字形式描述的,每一个文档可以表示为这样的一个集合 

其中 ::=< 单词或短语名称 >< 单词或短语的权值 >

---- 实际上就是采用矢量空间的表示方法来表示的文档。 

---- 我们对用户输入的查询表达式也采用矢量空间的表示方法。我们认为用户输入的
关键字的顺序代表了它的重要性的程度,所以对于位置靠前的单词有相对比较高的优先
级,同时我们对所有的内容以短语或者是单词为最小原子,进行Stem操作,即象前面
所提到的:比如单词Encouraging就转化成Encourage的格式。然后去掉那些Stop Word,
比如is ,as等等的单词,这些单词存放在StopWordTbl表中。 然后把所有归整化后的内容
放入动态数组word_weight_col中去。 

---- 2.对于动态数组word_weight_col中的每一个元素,即结构word_weight_pair(包
括单词和该单词的权重),我们从表WordDictionaryTbl中可以找到和这些单词相关的记
录,这些记录应该是包括了所有的在word_weight_col中的单词。 

---- 进行网页是否和查询相匹配的计算。匹配计算的过程如下:首先我们对所有的记
录按URL地址进行排序。因为可能好几条记录对应的是一个URL,然后对每一个网页进
行打分,每一条记录的单词权值为INITSCORE*WEIGHT+(TOTALTIMES-1)*WEIGHT* INCREMENT。
其中INITSCORE为每一个单词的基准分数,TOTALTIMES为该单词在网页中的出现的次数,
WEIGHT是该单词在不同的内容段出现有不同的权值(比如在KEYWORD段,或者是标题段,
或者是内容段等等)。INCREMENT是该单词每多出现一次所增加的分数。 

---- 3.根据用户指定的m_maxReturnSum,显示匹配程度最高的前m_maxReturnSum页。 

---- 四、结束语 

---- 我们利用上面所讨论的机制,在WINDOWS NT操作系统下,用VC++和SQL SERVER实现了
一个Web搜索引擎的网页搜集过程。在建立了一个基本的搜索引擎的框架以后,我们可以
基于这个框架,实现一些我们自己设计的算法,比如如何更好的进行Spider的调度,如何更
好的进行文档的归类,如何更好的理解用户的查询,用来使Web搜索引擎具有更好的智能性
和个性化的特点。 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -