基于ajaxlucene构建搜索引擎的设计和实现—免费毕业设计论文内容摘要:

系统 模块 数据库的设计 本课题包含一张用于存放抓取回来的网页信息如表 1。 第 8 页 共 19 页 表 1 网页数据存储表 逻辑字段名 物理字段名 字段类型 是否为空 主键 外键 说 明 编号 ID int NOT NULL Yes 自增加 地址 Url Varchar(50) NOT NULL 内容 Content VARCHAR(1000) NOT NULL meta 标签内容 Mata Varchar(100) NOT NULL 网页标题 Title Varchar(100) NOT NULL 创建时间 Createdate Datetime(8) NOT NULL 模块设计 该模型按照功能划分为 三 个部分,一是 爬虫抓取网页部分 ,二是 从数据库建立索引 部 分 ,三是 从前台页面查询 部 分。 系统的功能流程 (如 图 和 )。 输 入 一 个 U R L结 果 列 表 启 动 爬 虫 程 序 使 用 L u c e n e . n e t 文 档 类建 立 文 档 索 引不 断 的 抓 取 网 页写 入 数 据 库去 掉 多 余 标 签获 取 有 效 记 录 页 面 上 输 入 关 键 字使 用 L u c e n e . n e t 搜 索 类是 否 成 功YA J A X 图 功能流程图 第 9 页 共 19 页 图 模块图 该系统用 3 个模块来实现搜索引擎的主要功能。 流程如上图所示。 从一个或 若干初始网页的 URL 开始,获得初始网页上的 URL,在抓取网页的过程中,不断从当前页面上 抽取新的 URL 放入队列 ,直到满足系统的一定停止条件。 这条件可以是限定的谋个域名空间、或者是限定的网页抓取级数。 当在获取 URL 时存在这样的问题就是在实际应用中主要以绝对地址和相对地址来表现。 绝对地址是指一个准确的、无歧义的 Inter 资源的位置,包含域名(主机名)、路径名和文件名;相对地址是绝对地址的一部分。 然后把抓取到的网页信息包括网页内容、标题、链接抓取时间等信息经过 ‘ 减肥 ’ 后保存到网页存储数据库表里。 然后通过正则表达式,去掉多余的 HTML 标签。 因为抓取的网页含有 HTML 标签、 Javascript 等, 对搜索多余的信息,如果抓取到的网页不经过处理就会使搜索变得不够 精确。 让爬虫程序能继续运行下去 , 就得抓取这个网页上的其它 URL,所以 要用正则将这个网页上的所有 URL 都取出来 放到一个队列里。 用同样的方法继续抓取网页 , 这里将运用到多线程技术。 为 了对 文档进行索引, Lucene 提供了五个基础的类,他们分别是 Document,Field, IndexWriter, Analyzer, Directory Document 是用来描述文档的,这里的文档可以指一个 HTML 页面,一封电子邮件,或者是一个文本文件。 一个Document 对象由多个 Field 对象组成的。 可以把一个 Document 对象想象成数据库中的一个记录,而每个 Field 对象就是记录的一个字段。 在一个文档被索引之前,首先需要对文档内容进行分词处理,这部分工作就是由 Analyzer 来做的。 Analyzer 类是一个抽象类,它有多个实现。 针对不同的语言和应用需要选择适合的 Analyzer。 Analyzer 把分词后的内容交给 IndexWriter 来建立 索引。 所有的搜索引擎的目标都是为了用户查询。 通过查询页面,输入关键字,提交给系统,程序就开始处理,最后把结果以列表的形式显示 出来。 在用 Lucene的搜索引擎中,用到了 Lucene 提供的方法,可从所建立的索引文档中获得结果。 第 10 页 共 19 页 5 系统 实现 开发环境 开发平台的选择:本系统的开发平台选择微软公司的 .NET,开发工具采用。 .NET 是 Microsoft 面向 Web 服务的平台,由框架、 Web 服务、 .NET企业服务器等几部分组成,提供涉及面较广、功能较全面的解决方案。 数据库选择:根据需求分析选择了 MSSQL Server 2020。 关键代码详解 代码结构 如图 6: 写入 读取 生成 引用 检索 图 6 代码结构 在网页爬虫 Console 端应用程序里输入一个有效的 URL后这部份就开始从第一个 URL 开始遍历相关的链接并把相关的信息写入到网页数据存储数据库里,然后就由索引生成程序读取网页数据存储数据库,对每条记录生成索引记录,存放于生成的索引库文件里。 生成索引需要调用 类。 索引生成后在查询部分就能够在网页上输入关键字,对刚才抓取的信息的查询。 并可以定位到信息的出处。 下面对各部分关键代码 进行详解。 爬虫部分 这部份的功能就是从输入的 URL开始遍历各个相关的网页,它包括三个功能模块: 网页抓取模块、网页减肥模块、爬虫维持模块。 首先定义一些变量用于保存抓取到的网页信息, urlList 用于保存当前页面上的 URL集合。 然后根据全局变量 url 抓取此 URL的网页信息到字节流变量里,经过转码后读取到变量 PageString 里,下步通过函数 GetHttpUrl(PageString)对PageString 中的 URL 标 记 进 行 提取 并返 回 到 urlList 变 量里 ,函 数GetTitle(PageString) 、 parseScript(PageString) 、 parseHtml(PageString) 、网页爬虫 Console 端应用程序 数 据 库 索引生成 Console 端应用 查询 Web 程序 第 11 页 共 19 页 parseChar(Content)分别对网页信息变量获取标题、去除脚本块、去除 HTML 标记、去除特殊字符操作。 再下步就是对获取到的标题、网页内容、链接等信息调用数据库操作通用类 DAI 保存到数据库里,这就实现了一个网页的抓取。 再下步就是循环的对获取到的 URL 列表创建线程,针对每个 URL 来循环的执行上面的网页信息的抓取操作。 具体代码如下: private static void UrlThread() { String title=。 String Content=。 String mata=。 string URL=。 string[] urlArr = null。 StringBuilder urlList = new StringBuilder()。 Client=new ()。 try { Stream strm=null。 try {//读取一个 URL的信息到流变量里 Stream strm=(url)。 } catch { (url无法找到。 )。 return。 } StreamReader sr=new StreamReader(strm,(gb2312))。 String PageString=()。 //从流中读取网页信息到字符串变量中 ()。 urlList = GetHttpUrl(PageString)。 title=GetTitle(PageString)。 Content = parseScript(PageString)。 //去掉脚本 的网页文本 Content=parseHtml(PageString)。 //得到去了 HTML标签的网页文本 URL=url。 mata=。 Content = parseChar(Content)。 if((title != || title != ) amp。 amp。 URL != ) { (insert into WebContent(url,content,title,mata) values(39。 +URL+39。 ,39。 +Content+39。 ,39。 +title+39。 ,39。 +mata+39。 ))。 (对 url:+URL+相关信息写入数据库成功 !)。 } else 第 12 页 共 19 页 { (对 url:+URL+相关信息写入数据库失败 !)。 } urlArr=().Split(39。 |39。 )。 //对前面获取的 URL列表循环的创建线程再执行本方法实现爬虫的维持 for(int i=0。 i。 i++) { url=urlArr[i]。 if(url == || url == null || url == ) continue。 Thread th = new Thread(new ThreadStart(UrlThread))。 ()。 } } catch{} } 索引生成 这部分包含对文本的索引生成以及对数据库数据的索引生成,下面只对数据库索引生成的关键代码进行介绍: 下面这段代码实现对数据库里存储的记录创建索引。 主要通过 Lucene 提供的方法来协助实现。 public Indexer(string indexDir) { region Lucene Code 首先通过标准分词定义了一个索引写入器 IndexWriter writer = new IndexWriter(indexDir, new StandardAnalyzer(), true)。 在创建索引库时,会合并多个 Segments 文件。 此方式有助于减少索引文件数量,减少同时打开的文件数量。 (false)。 //删除以前生成的索引文件。 (iDexDir,true)。 endregion DateTime start =。 DoIndexByDB(writer)。 // DateTime end =。 int docNum = ()。 (Index Finished. {0} Documents takes {1} second., docNum, ((TimeSpan)(end start)).TotalSeconds)。 ()。 ()。 } 使用 Lucene 提供的方法对数 据库中的每条记录建立索引实现如下: 第 13 页 共 19 页 Document doc = new Document()。 (Indexing {0} , row[title].ToString())。 ((contents, row[content].ToString()))。 ((title, row[title].ToString()))。 ((mata,row[mata].ToString()))。 ((CreateDate,row[CreateDate].ToString()))。 ((Url,row[Url].ToString()))。 ((ID,row[ID].ToString()))。 (doc)。 页面查询 这部分主要完成的功能是获取前台表单中输入的关 键字,在程序中获取查询结果,最后把列表显示在前台页面。 Ajax 在此部分中被使用到,它完成的功能是部分刷新页面,不需整个页面的重新加载。 为了方便的在程序中使用 Ajax,此系统引用了封装完善的 Ajax类库。 在程序中注册后,在 html 里就可以使用 Javascript 来调用后台的程序。 选取部分代码来说明: 首先在页面后台程序中进行 Ajax 注册,代码如下: private void Page_Load(object sender, e) { //ajax注册 (typeof(Search))。 } 如果前台 Javascript 需要调用某个方法,那就在那个函数前加上[],表示此方法属于 ajax 应用。 [] public string SearchResult(string keywords,string pageNo) { 其中,前台所存在的文字的代码如下: StringBuilder sb = new StringBuilder()。 (trtd结果数 :+result+ 所用时间 :+t+毫秒 /td/tr)。 前台显示结果记录的代码,动态生成 table 标签,如下: for(int i = startNum。 i endNum。 i++) { 在显示内容中,仍然使用到了 Lucene 提供的类, 可以方便的从所建立的索引文档中 获取 网址,网页标题,内容,时间。 Document doc = (i)。 content=(contents)。 content=(keywords,font color=red+keywords+/font)。 (tr class=+c+)。 (td。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。