基于lucene的图书搜索引擎的设计与实现内容摘要:

2020年初, IA 的目的是开发 一个特殊的爬虫,对网上的资源进行归档,建立网络数字图书馆,在过去的 6 年里,IA 已经建立了 400TB 的数据。 Heritrix 主要有三大部件:范围部件,边界部件,处理器链。 范围部件:主要按照规则决定将哪个 URI 入队。 边界部件:跟踪哪个预定的 URI 将被收集,和已经被收集的 URI,选择下一个 URI,剔除已经处理过的 URI。 处理器链:包含若干处理器获取 URI,分析结果,将它们传回给边界部件。 Heritrix 包含以下关键特性:。 2。 从一个提供的种子进行爬,收集站点内的精确 URI,和精确主机。 3。 主要是用广度优先算法进行处理。 7 4。 主要部件都是高效的可扩展的 5。 良好的配置,包括: a。 可设置输出日志,归档文件和临时文件的位置 b。 可设置下载的最大字节,最大数量的下载文档,和最大的下载时间。 c。 可设置工作线程数量。 d。 可设置所利用的带宽的上界。 e。 可在设置之后一定时间重新选择。 f。 包含一些可设置的过滤机制,表达方式, URI 路径深度选择等等。 Heritrix 的局限: 1。 单实例的爬虫,之间不能进行合作。 2。 在有限的机器资源的情况下,却要复杂的操作。 3。 只有官方支持,仅仅在 Linux 上进行了测试。 4。 每个爬虫是单独进行工作的,没有对更新进行修订。 5。 在硬件和系统失败时,恢复能力很差。 3 系统设计 系统实现流程图 设 计 人 员选 择 图 书 信 息 来源 网 站 及 网 页相 关 网 站 内 容 和 网页 分 析定 向 下 载 相 关 网 站的 图 书 网 页 内 容网 页 内 容 提 取 和 正则 表 达 式 分 析建 立 网 页 内 容 索 引设 计 前 台 页 面 提供 搜 索检 索 用 户图 系统实现流程图 8 系统顺序图 图 系统顺序图 9 系统状态图 图 体统状态图 数据库设计 数据库建立 图书信息数据库只需完成对于读书相关信息的存储,所以比较简单, 只需建立 bookInfo 表,如下表:表 数据库设计表 列名 数据类型 允许空 是否主键 id int 非 主键 name varchar(50) 非 type varchar(50) content varchar(MAX) url varchar(50) imageurl varchar(50) updatetime varchar(64) 10 数据库 连接 开 始J D B C 建 立 数据 库 连 接是 否 完 成信 息 添 加关 闭 数 据 库 连接向 数 据 库 添 加产 品 信 息结 束是否图 数据库表结构图 一、装入 JDBC 驱动程序 DriverManager 类管理各种数据库驱动程序,建立新的数据库连接,以便将 Java 应用程序能够使用正确的 JDBC 驱动程序。 DriverManager 类包含一系列 Driver 类,它们通过调用方法 对自己进行了注册。 所有 Driver 类都必须包含有一个静态方法,利用这个静态方法可以创建该类的实例,然后在加载该实例时向 DriverManager 类进行注册。 这样,用户正常情况下将不会直接调用 ,而是在加载驱动程序时 由驱动程序自动调用。 可以通过调用方法 (),这种方法可以显式地加载驱动程序类。 如: //装载并注册 SQL Server Driver (“”)。 (new ())。 二、建立连接 建立连接需要使用 DriverManager 类的静态方法 getConnection(String url,String username,String password)来建立数据库的连接对象。 其中的三个参数, url 表示连接数据库的 JDBC URL, username 表示连接数据库的用户名, password 表示连接数据库的密码。 如: //建立 SQL Server Driver 数据库连接 String url = “ jdbc:microsoft:。 DatabaseName=test”。 String username = “sa”。 String password = “123456”。 Connection conn = null。 try{ 11 conn = (url,username,password)。 }catch(Exception e){ ()。 } JBDC URL 的一般格式为: jdbc:drivertype//parameters drivertype 表示驱动程序的类型, parameters 通常用来设定数据库服务器的 IP 地址、端口号以及数据库名称。 三、执行 SQL 语句 与数据库建立连接之后,就可以向所连接的数据库发送 SQL 语句。 JDBC 提供了 3 个类,它们由Connection 来创建这些类的对象。 这 3 个对象分别是 Statement 对象, PreparedStatement 对象,以及CallableStatement 对象。 它们都可以作为执行 SQL 语句的容器。 每一个都专用于发送特定类型的 SQL 语句。 1) Statement 对象用语执行不带参数的简单 SQL 语句,由方法 createStatement 所创建。 2) PreparedStatement 对象用语执行带参数或不带参数的预编译 SQL 语句,由 PreparedStatement 创建。 PreparedStatement 接口继承自 Statement 接口,其功能更加的强大。 在 PreparedStatement 对象所使用的 SQL语句中,包含了经过预编译的 SQL 语句,因此可以获得更高的执行效率,同时使用起来也更加的方便。 在PreparedStatement 对象所使用的 SQL 语句中,可以包含多个用 ”?”代表的字段,同时也可以是哦那个setXXXX()的方 法来设置该字段的内容,从而增强了程序的动态性。 3) CallableStatement 对象用于执行对数据库存储过程的调用,由方法 prepareCall 所创建。 CallableStatement用于执行 SQL 存储过程 —— 一组通过名称来调用(就像函数的调用那样)的 SQL 语句。 四、检索结果 SQL 语句发送以后,返回的结果通常存放在一个 ResultSET 类的对象中,可将 ResultSet 对象看做一个表,这个表中包含由 SQL 返回的列名和相应的值, ResultSet 对象中维持了一个指向当前的指针,通过一系列的 getXXXX()方法,可以检索当前行的各个列,并显示出来。 五、关闭连接 在对象使用完毕后,应当使用 close()方法解除与数据库的连接,并关闭数据库。 关闭数据库的语句为: ()。 索引建立 Lucene的索引过程 从 IndexWriter 的 addDocument 方法开始。 在 Lucene 的 API 中, IndexWriter 的主要职责是向索引中加入文档,它提供了建立索引的只要外部借口,但是它的具体实现,也就是索引的写入过程是由 DocumentWriter来完成的。 因此,在整个 Lucene中, 最繁琐的对数据源分词、计算出现频率和位置,以及写索引过程,实际上是发生在 DocumentWriter 中的。 在 DocumentWriter中完成了向索引的一些情况进行判断,并作进一步的合并索引等操作。 其基本流程步骤如下: JE分词的 MMAnalyzer 的实例,用于对文本进行中文分词和文本分隔处理。 12 ,将前面所处理的词库进行加载,相关的文件存储位置通过项目中的配置管理类实例 PropertyConfiguration 得到。 addBook方法,以 Book类型的对象和一个 ID值为参数,调用 方法处理,生成 Lucene的 Document文档对象。 IndexWriter 的 addDocument 方法,加入索引中,完成索引的创建和追加。 除此之外项目中的 BookIndexer类中还提供了 optimize()方法和 close()方法,分别用来对索引进行优化和关闭索引。 索引创建的程序流程图如图 : 开 始创 建 J E 分 词 的M M A n a l y z e r创 建 文 件 读 取F i l e R e a d e r 并与 分 词 器 关 联创 建 索 引 写 入对 象 I n d e x W r i t e r是 否 完 成 信 息添 加关 闭 所 有 对 象连 接结 束创 建 图 书D o c u m e n t 文 档索 引 对 象添 加 文 档 到 索引 文 件是否图 索引创建流程图 图书信息综合处理 项目中需要建立一个类,把数据库操作、索引操作都集中起来。 首先它要可以从文本文档中提取出需要的内容,来 构建 Book对象;然后调用 BookJDBC,向数据库中写入 Book相关信息。 另外,再调用 BookIndexer,把 Book对象加入到索引中。 具体的操作步骤如下: BookJDBC 类和 BookIndexer 类,来对具体的图书信息进行处理。 ,并生成一个 BookTextFileProcessor 的实例后,需要调用其 initialize 方法来初始化 BookJDBC 类的实例和 BookIndexer 的实例。 setDirectories 方法,为其注入所要处理的图书详细信息文件所在的目录,然后调用process 方法开始处理图书信息。 程序的流程图如下页图 : 13 开 始向 索 引 中 添 加B o o k 对 象信 息 存 入 数 据 库生 成 图 书 信 息摘 要生 成 一 个B o o k 对 象是 否 完 成 信 息 添加优 化 索 引结 束是否遍 历 目 录 读 取图 书 属 性 信 息 图 数据库、索引综合处理流程图 4 系统实现 使用 Heritrix 抓取目标网站 选择目标网站 选择目标网站看似是一个很简单的过程,但是实际操作起来你就会发现其实不然。 首先我们要选择几个包含很多图书信息的网站,并以这 些网站来作为 Heritrix 网络爬虫爬取信息的链接源。 在选定了网站之后就要对这些网站的网页进行分析。 因为我们要把包含图书分类的页面作为爬取源,所以我们要尽量选择包含所有图书分类的页面,如果有固然好,但是实际操作中你会发现有的网站的图书分类并不会在一个页面中显示出来。 这就要求我们对网站页面源代码进行仔细分析,找出目录的路径以供 Heritrix 进行爬去。 必要的时候我们甚至要编写一些 java 小程序生成这些路径。 在本项目中我选用新书城网( )做为搜索源。 但是由于需要遍历所有的图书 链接以实现网络爬虫的爬取,我需要编写 java小程序来抽取链接。 配置 Heritrix、开始抓取 在做好以上的准备工作之后,开始启动 Heritrix进行任务的抓取。 Heritrix 的启动方式有多种,这里选择的是最常用的 WebUI 方式启动。 在 MyEclipse 配置好 Heritrix,运行 这个类。 此时,在 Heritrix 的后台已经对服务的 8080 端口进行了监听,在浏览器中访问 :8080,就可以打开 Heritrix的 WebUI了。 如下图: 14 图 WebUI 界面 下面要做的就是根据新书城网( )的网页特点,开发定制的下载扩展处理模块。 可以完成对链接的提取,内容的抽取等功能。 定制的网络爬虫要求不保存其他无关页面。 因此,需要扩展Heritrix,以实现无关页面过滤的。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。