搜索引擎优化高级编程(研究方向J2EE,数据结构与索引表结构的搜索引擎与算法分析)
优采云 发布时间: 2021-10-17 07:06搜索引擎优化高级编程(研究方向J2EE,数据结构与索引表结构的搜索引擎与算法分析)
-1-张文,基于Servlet的中国科技论文在线搜索引擎* 作者简介:张文(1989~),本科。研究方向:J2EE,数据结构与算法分析(中南林业科技大学计算机与信息工程学院,长沙410004) 摘要:基于数据结构中的Servlet技术和哈希映射,Web的关键pages是构造索引表 5.根据客户端提供的关键字,对索引表进行分析,得到搜索结果,由于搜索过程是访问缓存,所以搜索效率高. 该技术可广泛应用于中小型服务器作为站点上的搜索引擎,对于大中型服务器,可提供广域网网页搜索服务。< @关键词:J2EE;小服务程序;搜索引擎; 索引表中的索引号:TP312 10 基于 Servlet 搜索引擎 张文(中南林业科技大学,长沙 410004) 摘要:基于 Servlet 技术和哈希映射的数据结构,构建了 15索引表方式实现web关键词组织,根据客户端提供的关键词对索引表进行分析,得到搜索结果。由于搜索过程是访问缓存,具有更高的搜索效率,在小型服务器中可以广泛采用这种技术作为立场在搜索引擎中,基于Servlet技术和hash映射的数据结构,构建了15个索引表方式实现网页关键词组织。根据客户端提供的关键字对索引表进行分析,得到搜索结果。由于搜索过程是访问缓存,具有较高的搜索效率,在小型服务器中可以广泛采用这种技术作为搜索引擎的站内,基于Servlet技术和hash映射的数据结构,构建了15个索引表方式实现网页关键词组织。根据客户端提供的关键字对索引表进行分析,得到搜索结果。由于搜索过程是访问缓存,具有较高的搜索效率,在小型服务器中可以广泛采用这种技术作为搜索引擎的站内,
要从海量数据中找到自己需要的信息,首先需要将海量数据组织成易于查找的数据结构。其次,在组织过程中,必须体现关键字的作用,即用关键字作为标识符来标识记录条目。此外,随着网络信息的不断更新,信息库可以实现自我维护,从而保证信息库的全面性和及时性。本文从搜索引擎的角度介绍了一种基于Servlet的搜索引擎和基于J2EE的索引表结构[1]。搜索引擎以用户的输入作为关键词查询索引表,在用户使用搜索引擎的过程中不断维护和重构索引结构,从而实现索引表(也可以理解为信息数据库)的自更新。该搜索引擎采用文件格式作为信息数据库存储在磁盘上,并在内存中设置缓存,实现信息的备份和更新。这个搜索引擎的作者已经意识到它可以在中小型服务器上广泛用作现场搜索引擎,也可以在大中型服务器上用作网络搜索引擎。1 索引磁盘文件结构索引在搜索引擎中的作用可以理解为字典中目录的作用。当我们需要查找单个 35 个单词时,通过目录查找单词所在的字典中的页码,这往往比随机翻页要好。查字典要快得多,搜索引擎中的索引也有同样的作用。为了在最短的时间内找到所需的信息,需要为所有现有的信息构建一个易于组织和搜索的数据结构——索引。
当接收到用户提出的关键词时,搜索索引表,找到需要的信息。索引表的数据结构和相应的搜索算法[2]决定了搜索引擎的性能。索引表[3]中的40个索引条目模仿字典中目录条目的结构,以关键字为标识,另一端指向目标URL的唯一标识。目标URL的结构采用单独的字符串结构,按顺序排列,其序列值作为唯一标识。索引条目构建完成后,将目标URL和索引条目组织在一起,形成索引表的磁盘文件。图 1 索引表的磁盘文件结构 2 索引逻辑结构数据结构 哈希表类型的 Index 是整个索引表在内存中的结构(缓存)[4],也是搜索引擎的主要数据结构. 从索引表的文件结构可以发现,每个关键字对应一个记录条目。这50条记录条目可以看成是一行字符串,如“add|2 1|3 3|4 1|5 7”表示“添加”key 这个词在第2号URL中出现1次,在URL中出现3次4号,4号URL 1次,5号URL 7次 延迟加载 为了在最短的时间内得到关键字对应的URL,需要将字符串结构的索引项解析为URL 数组结构 ("|2 1|3 3|4 1|5 7"
但是,如果在搜索引擎初始化的时候把所有的字符串索引项都解析出来,效率就会大大降低。因此,一个可行的方法是使用延迟加载[5]。初始化时,使用字符串作为关键字对应的值。使用一次时,会解析成URL数组结构,将字符串替换为关键字对应的值(利用java语言HashTable的特性),使用时直接使用URL数组以后吧。还需要 60 个以上的分辨率。在搜索过程中,根据关键字搜索Index hash map,得到该关键字对应的URL信息。因为在java语言中一个key对应的是HashTable的值,所以它是Object类型的(所有数据类型的父类)。班级),所以返回一个 Object 类型的对象。如果对象是数组类型的对象,则说明缓存中的关键字已经解析完毕,65构成了可以直接使用的查询结果。否则需要对字符串进行解析,结果为数组类型的结果。并更新Index表中的数据。图2 搜索引擎工作流程 70//从HashTable中移除索引项 Object data = (()); if (data instanceof String) {75//根据关键字返回对应的数组 dataForWord = cacheFilesForWord(word);} else { dataForWord = (Vector) data;} 80if (dataForWord != null) {int i, max; 85max = ();//初始化结果集 resultfor (i = 0; i <max; i++) {- 4-中国科技论文在线 //取出索引条目 90 entry = (IndexEntry) (i);
索引表的维护主要表现在索引表的定期更新[6]。因此,需要设置时间记录表(hash map set)的数据结构来记录索引表的更新时间,从而实现对索引表的定期维护。对于索引表[7]的维护,可以采用两种方案。一是建立单独的定时线程,定期进行索引维护;第二种方案是每次用户搜索时触发索引管理器,根据系统时间决定是否进行维护工作。这里我们采用第二种方案。当索引管理器被触发时,执行索引管理105管理工作。如果到达更新时间,将更新索引文件。由于更新磁盘索引文件涉及 I\O 操作,这是一个相对耗时的过程,因此需要单独进行。启动一个读写线程来更新磁盘文件。以上就是索引管理器的工作过程。110 图3 索引管理器的执行过程 HTMLIndex retVal = null; 对象测试 = 空;IndexLoader 加载器 = null; 115 如果(fulldir == null)返回空值;synchronized(indices){-5-中文科技论文在线测试=(fulldir(fulldir,loader);//加入时间记录表(fulldir,newDate());)130else if(test instanceof HTMLIndex)(retVal = (HTMLIndex) test;// 何时重新检查目录是否改变 if (updateInterval> < @0) {try {135Date now = new Date(), load;long nw, ld;load = (Date) (fulldir );nw = ();ld = (); 启动一个读写线程来更新磁盘文件。以上就是索引管理器的工作过程。110 图3 索引管理器的执行过程 HTMLIndex retVal = null; 对象测试 = 空;IndexLoader 加载器 = null; 115 如果(fulldir == null)返回空值;synchronized(indices){-5-中文科技论文在线测试=(fulldir(fulldir,loader);//加入时间记录表(fulldir,newDate());)130else if(test instanceof HTMLIndex)(retVal = (HTMLIndex) test;// 何时重新检查目录是否改变 if (updateInterval> < @0) {try {135Date now = new Date(), load;long nw, ld;load = (Date) (fulldir );nw = ();ld = (); 启动一个读写线程来更新磁盘文件。以上就是索引管理器的工作过程。110 图3 索引管理器的执行过程 HTMLIndex retVal = null; 对象测试 = 空;IndexLoader 加载器 = null; 115 如果(fulldir == null)返回空值;synchronized(indices){-5-中文科技论文在线测试=(fulldir(fulldir,loader);//加入时间记录表(fulldir,newDate());)130else if(test instanceof HTMLIndex)(retVal = (HTMLIndex) test;// 何时重新检查目录是否改变 if (updateInterval> < @0) {try {135Date now = new Date(), load;long nw, ld;load = (Date) (fulldir );nw = ();ld = (); 对象测试 = 空;IndexLoader 加载器 = null; 115 如果(fulldir == null)返回空值;synchronized(indices){-5-中文科技论文在线测试=(fulldir(fulldir,loader);//加入时间记录表(fulldir,newDate());)130else if(test instanceof HTMLIndex)(retVal = (HTMLIndex) test;// 何时重新检查目录是否改变 if (updateInterval> < @0) {try {135Date now = new Date(), load;long nw, ld;load = (Date) (fulldir );nw = ();ld = (); 对象测试 = 空;IndexLoader 加载器 = null; 115 如果(fulldir == null)返回空值;synchronized(indices){-5-中文科技论文在线测试=(fulldir(fulldir,loader);//加入时间记录表(fulldir,newDate());)130else if(test instanceof HTMLIndex)(retVal = (HTMLIndex) test;// 何时重新检查目录是否改变 if (updateInterval> < @0) {try {135Date now = new Date(), load;long nw, ld;load = (Date) (fulldir );nw = ();ld = ();
IndexEntry 是索引条目的模型对象,它记录了关键字在指定 URL 中出现的次数,可以理解为索引文件中的“|2 1”作为一个 IndexEntity 对象。HTMLIndex 是系统整个索引表的模型对象,收录全局索引信息和一系列相关的查询方法。IndexBuilder 是一个构建索引文件的模型对象,用于读取站点信息并按照指定的格式在磁盘上构建索引文件[8]。IndexManager 是一个索引管理器对象,用于定期维护磁盘上的索引文件。170-6-中文科技论文在线 图4 搜索引擎核心类之间的依赖 测试关键词搜索 用户输入要搜索的关键词(英文单词),点击搜索返回搜索结果。搜索结果反映在URL浏览器端,通过超链接跳转到指定网页。175 图5 测试界面 5 结束语 本文介绍了一个基于Servlet的搜索引擎,其核心数据结构是索引表和哈希图。这种搜索引擎具有实现简单、性能优良、维护成本低等特点,特别适合中小型网站作为站内搜索引擎。虽然索引文件是以文件的形式存储在磁盘上的,由于缓存的作用,搜索过程中的IO操作大大减少,从而提高了效率。另外,由于索引管理器的存在,在维护索引文件时,会不断地向索引文件中添加新的索引信息,实现索引文件的自更新。
由于缓存索引在数据结构中使用了hash映射,并结合了Java语言的特点,实现了索引信息的懒加载,大大提高了站点的整体性能。185-7-中国科技论文在线[参考文献](参考文献) [1] David in Java,第三版,Bruce Eckel,2003. 190 [2] 姜凯,吴钢山。基于 Web 的信息检索技术概述。计算机工程, 2005, 12: 7-9 [3] Java 中的彼得结构和算法。朱建平。北京:清华大学出版社,2006 [4] Stephen Asbary,Java 企业应用开发,王强,机械工业出版社,2004. [5] 白胜普,J2EE 企业应用测试实践,北京:清华大学出版社,2009 [6] W Bruce Creeft,搜索引擎:信息检索实践,刘婷。机械工业出版社,2010 195 [7] 维滕.深度搜索引擎,电子工业出版社,2009. [8] Jaimie Sirovich,搜索引擎优化高级编程。邓少坤,北京:清华大学出版社,2008