首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

一个 Java 搜索引擎的实现--网页预处理(1)

一个 Java 搜索引擎的实现--网页预处理(1)

预处理模块的整体结构预处理模块的整体结构如下:
图 1. 预处理模块的整体结构通过 spider 的收集,保存下来的网页信息具有较好的信息存储格式,但是还是有一个缺点,就是不能按照网页 URL 直接定位到所指向的网页。所以,在第一个流程中,需要先建立网页的索引,如此通过索引,我们可以很方便的从原始网页库中获得某个 URL 对应的页面信息。之后,我们处理网页数据,对于一个网页,首先需要提取其网页正文信息,其次对正文信息进行分词,之后再根据分词的情况建立索引和倒排索引,这样,网页的预处理也全部完成。可能读者对于其中的某些专业术语会有一些不明白之处,在后续详述各个流程的时候会给出相应的图或者例子来帮助大家理解。
建立索引网页库原始网页库是按照格式存储的,这对于网页的索引建立提供了方便,下图给出了一条网页信息记录:
清单 1. 原始网页库中的一条网页记录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx     // 之前的记录

version:1.0                           // 记录头部
url:http://ast.nlsde.buaa.edu.cn/
date:Mon Apr 05 14:22:53 CST 2010
IP:218.241.236.72
length:3981

<!DOCTYPE ……                     // 记录数据部分
<html> …… </html>

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx     // 之后的记录
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx




我们采用“网页库名—偏移”的信息对来定位库中的某条网页记录。由于数据量比较大,这些索引网页信息需要一种保存的方法,dySE 使用数据库来保存这些信息。数据库们采用 mysql,配合 SQL-Front 软件可以轻松进行图形界面的操作。我们用一个表来记录这些信息,表的内容如下:url、content、offset、raws。URL 是某条记录对应的 URL,因为索引数据库建立之后,我们是通过 URL 来确定需要的网页的;raws 和 offset 分别表示网页库名和偏移值,这两个属性唯一确定了某条记录,content 是网页内容的摘要,网页的数据量一般较大,把网页的全部内容放入数据库中显得不是很实际,所以我们将网页内容的 MD5 摘要放入到 content 属性中,该属性相当于一个校验码,在实际运用中,当我们根据 URL 获得某个网页信息是,可以将获得的网页做 MD5 摘要然后与 content 中的值做一个匹配,如果一样则网页获取成功,如果不一样,则说明网页获取出现问题。
这里简单介绍一下 mySql 的安装以及与 Java 的连接:
  • 安装 mySql,最好需要三个组件,mySql,mySql-front,mysql-connector-java-5.1.7-bin.jar,分别可以在网络中下载。注意:安装 mySql 与 mySql-front 的时候要版本对应,MySql5.0 + MySql-Front3.2 和 MySql5.1 + MySql-Front4.1,这个组合是不能乱的,可以根据相应的版本号来下载,否则会爆“‘ 10.000000 ’ ist kein gUltiger Integerwert ”的错误。
  • 导入 mysql-connector-java-5.1.7-bin.jar 到 eclipse 的项目中,打开 eclipse,右键点需要导入 jar 包的项 目名,选属性(properties),再选 java 构建路径(java Build Path),后在右侧点 (libraries),选 add external JARs,之后选择你要导入的 jar 包确定。
  • 接着就可以用代码来测试与 mySql 的连接了,代码见本文附带的 testMySql.java 程序,这里限于篇幅就不在赘述。
  • 对于数据库的操作,我们最好进行一定的封装,以提供统一的数据库操作支持,而不需要在其他的类中显示的进行数据库连接操作,而且这样也就不需要建立大量的数据库连接从而造成资源的浪费,代码详见 DBConnection.java。主要提供的操作是:建立连接、执行 SQL 语句、返回操作结果。
介绍了数据库的相关操作时候,现在我们可以来完成网页索引库的建立过程。这里要说明的是,第一条记录的偏移是 0,所以在当前记录 record 处理之前,该记录的偏移是已经计算出来的,处理 record 的意义在于获得下一个记录在网页库中的偏移。假设当前 record 的偏移为 offset,定位于头部的第一条属性之前,我们通过读取记录的头部和记录的数据部分来得到该记录的长度 length,从而,offset+length 即为下一条记录的偏移值。读取头部和读取记录都是通过数据间的空行来标识的,其伪代码如下:
清单 2. 索引网页库建立
1
2
3
4
5
6
7
For each record in Raws do
begin
    读取 record 的头部和数据,从头部中抽取 URL;
    计算头部和数据的长度,加到当前偏移值上得到新的偏移;
    从 record 中数据中计算其 MD5 摘要值;
    将数据插入数据库中,包括:URL、偏移、数据 MD5 摘要、Raws;
end;




您可能会对 MD5 摘要算法有些疑惑,这是什么?这有什么用? Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。MD5 的典型应用是对一段信息 (Message) 产生一个 128 位的二进制信息摘要 (Message-Digest),即为 32 位 16 进制数字串,以防止被篡改。对于我们来说,比如通过 MD5 计算,某个网页数据的摘要是 00902914CFE6CD1A959C31C076F49EA8,如果我们任意的改变这个网页中的数据,通过计算之后,该摘要就会改变,我们可以将信息的 MD5 摘要视作为该信息的指纹信息。所以,存储该摘要可以验证之后获取的网页信息是否与原始网页一致。
对 MD5 算法简要的叙述可以为:MD5 以 512 位分组来处理输入的信息,且每一分组又被划分为 16 个 32 位子分组,经过了一系列的处理后,算法的输出由四个 32 位分组组成,将这四个 32 位分组级联后将生成一个 128 位散列值。其中“一系列的处理”即为计算流程,MD5 的计算流程比较多,但是不难,同时也不难实现,您可以直接使用网上现有的 java 版本实现或者使用本教程提供的源码下载中的 MD5 类。对于 MD5,我们知道其功能,能使用就可以,具体的每个步骤的意义不需要深入理解。
返回列表