基于JAVA技术搜索引擎的设计与实现
- 格式:doc
- 大小:17.00 KB
- 文档页数:3
使用Java语言开发的智能导航系统设计与实现智能导航系统是一种能够帮助人们快速准确找到目的地的应用程序。
它利用现代技术,如全球定位系统(GPS)、地图数据和数据挖掘等,帮助用户规划最优路线、提供导航指引,并实时更新交通情况,以确保用户能够高效地到达目的地。
本文将介绍使用Java语言开发的智能导航系统的设计与实现。
1.系统需求分析和设计在设计智能导航系统之前,我们首先需要进行需求分析。
根据用户需求,我们确定了系统的功能和特点:1.1 用户注册和登录功能:用户可以注册账号并登录系统,以便个性化设置和历史记录的保存。
1.2 地点搜索功能:用户可以通过输入地点名称或关键词进行搜索,系统会提供相应的搜索结果,包括地点的详细信息和位置信息。
1.3 路线规划功能:用户可以根据起点和终点,系统会通过算法计算最优路线,并提供导航指引。
1.4 实时交通信息更新功能:系统会根据实时交通情况更新路线规划,并提供交通拥堵等提示。
1.5 用户个性化设置功能:用户可以根据自身需求设置导航偏好,如避开高速公路、选择步行模式等。
1.6 历史记录功能:系统会保存用户的历史查询记录,方便用户查看和操作。
基于以上需求,我们进行系统设计。
首先,我们选择使用Java语言进行开发,原因在于Java具有良好的跨平台性和较强的安全性。
其次,我们需要使用地图数据和GPS模块作为数据来源,以实现位置定位、路线规划和导航指引等功能。
2.系统实现2.1 用户注册和登录功能我们将通过设计数据库来存储用户信息,包括用户名、密码和个性化设置等。
通过使用Java的数据库连接技术,我们可以实现用户注册和登录功能。
用户从前端界面输入用户名和密码,系统将根据输入信息查询数据库,并判断是否允许用户登录。
2.2 地点搜索功能为了实现地点搜索功能,我们需要获取地图数据,并实现相应的搜索算法。
可以使用第三方地图数据API(Application Programming Interface)来获取地点信息,并通过算法进行关键词匹配。
java程序设计参考文献java程序设计参考文献java程序设计通过对Java编程语言的全面介绍,引导读者快速地掌握Java编程语言的核心内容并学会灵活运用所学的语言知识及面向对象的编程思想。
JAVA已经从一种平台无关的编程语言演变成一种与厂商及平台无关的健壮的服务器端技术,促使IT业界深入发掘以Web 为核心的应用程序的巨大潜力。
下面是java程序设计参考文献,欢迎大家阅读借鉴。
java程序设计参考文献一:[1]张泽,雷光波。
基于Java Web的创新创业管理系统设计与实现[J]. 软件导刊,2017,02:113-115.[2]张卫国。
基于JAVA教学网站平台关键技术的研究与实现[J]. 电子制作,2017,Z1:39-42.[3]周建儒。
基于Java Web的智能交通管理系统的设计与仿真[J]. 信息技术,2017,03:144-146.[4]周昱晨,罗向阳,张豪。
基于Java Web的小型企业自动化办公系统设计与研究[J]. 计算机时代,2017,03:30-33+36.[5]刘波,朱丽华。
基于Java语言的超市账单管理系统的设计与实现[J]. 安阳工学院学报,2016,06:26-29.[6]贾娜。
基于Java的医院挂号系统的设计[J]. 福建电脑,2016,11:132-133.[7]陈小虎,邓惠俊。
基于Java的小区车辆信息管理系统的设计与实现[J]. 电脑知识与技术,2017,02:64-65.[8]宋祥民,接怡冰,姜文,公政,柳岩妮。
基于Java的电能表自动抄表系统设计[J]. 电子质量,2017,03:10-13.[9]薛慧君。
可逆编程语言R-JAVA及其语言处理系统的设计[J]. 电子测试,2017,04:38+40.[10]齐燕。
Java语言图形编程工具的设计及应用[J]. 科技传播,2017,04:29-30.[11]许晶。
基于JAVA的虚拟种植程序设计与实现[J]. 天津科技,2017,03:54-56.[12]张防震,王海军,郭喜梅。
基于Ajax+Lucene构建搜索引擎的设计与实现摘要通过搜索引擎从互联网上获取有用信息已经成为人们生活的重要组成部分,Lucene是构建搜索引擎的其中一种方式。
搜索引擎系统是在.Net平台上用C#开发的,数据库是MSSQL Server 2000。
主要完成的功能有:用爬虫抓取网页;获取有效信息放入数据库;通过Lucene建立索引;对简单关键字进行搜索;使用Ajax的局部刷新页面展示结果。
论文详细说明了系统开发的背景,开发环境,系统的需求分析,以及功能的设计与实现。
同时讲述了搜索引擎的原理,系统功能,并探讨使用Ajax与服务器进行数据异步交互,从而改善现有的Web应用模式。
关键词:;异步更新;Ajax;搜索引擎The Design and Implementation for Constructing theSearch Engine with Ajax and LuceneAbstractObtaining useful information from web by search engines has become the important part of people's lives. Lucene is the way of constructing search engine. This system is based on the .Net platform using C#. The database is MSSQL Server 2000. Main functions are grasping web pages with crawls, adding effective information to the database, establishing index with Lucene, searching through keywords, and displaying the results finally.This paper has showed the principle of search engine in the form of different modules, functions of this system, improving traditional web application model using Ajax. It shows explanation of the system’s background, development environment, system analysis of demanding, and functions of design.Key words:; Asynchronous update; Ajax; Search engines目录论文总页数:19页1 引言 (1)1.1课题背景 (1)1.2国内外研究现状 (1)1.3本课题研究的意义 (1)1.4本课题的研究方法 (1)2 构建搜索引擎原理 (2)2.1全文搜索引擎 (2)2.1.1 搜索引擎的分类 (2)2.1.2 搜索引擎的工作原理 (2)2.2L UCENE与搜索引擎 (3)2.3索引和搜索 (4)2.4A JAX技术 (4)3 需求分析 (5)3.1同步环境 (5)3.2功能需求 (6)3.3性能需求 (6)3.4输入输出要求 (7)3.5运行需求 (7)4 方案设计 (7)4.1搜索引擎模型 (7)4.2数据库的设计 (7)4.3模块设计 (8)5 系统实现 (10)5.1开发环境 (10)5.2关键代码详解 (10)5.2.1 代码结构 (10)5.2.2 爬虫部分 (10)5.2.3索引生成 (12)5.2.4页面查询 (13)6 测试 (14)6.1功能测试 (14)结论 (16)参考文献 (16)致谢 (18)声明 (19)1 引言1.1 课题背景Lucene是一个基于Java的全文信息检索工具包,它为应用程序提供索引和搜索功能。
Compass技术文档目录一、原理描述:.................................................................................................................................二、术语解释:.................................................................................................................................三、下载地址:.................................................................................................................................四、使用流程: …………………………………………………………………………………….五、基于SSH的compass的实例: …………………………………………………………………一、原理描述:Compass是一流的开放源码JAVA搜索引擎框架,对于你的应用修饰,搜索引擎语义更具有能力。
依靠顶级的Lucene搜索引擎,Compass 结合了,像Hibernate和Spring的流行的框架,为你的应用提供了从数据模型和数据源同步改变的搜索力.并且添加了2方面的特征,事物管理和快速更新优化.Compass的目标是:把java应用简单集成到搜索引擎中.编码更少,查找数据更便捷.二、术语解释:三、下载地址:四、使用流程:五、基于SSH的compass的实例:step1在ssh2的基础上开发加入jar包(compass-2.1.2.jar compass-index-patch.jarlucene-analyzers-2.4.0.jar lucene-core-2.4.0.jar lucene-highlighter-2.4.0.jar paoding-analysis.jar)step2先来看下实体bean的编写Java代码1.package com.v512.example.model;2.import pass.annotations.*;3./**4. * Product entity.5. *6. * @author MyEclipse Persistence Tools7. */8.@Searchable9.public class Product implements java.io.Serializable {10.11. // Fields13. @SearchableId14. private String id;15. @SearchableProperty(name="name",index=Index.ANALYZED,store=Store.YES)16. private String name;17. @SearchableProperty(name="price",index=Index.NOT_ANALYZED,store=Store.YES)18. private Double price;19. @SearchableProperty(name="brand",index=Index.ANALYZED,store=Store.YES)20. private String brand;21. @SearchableProperty(name="description",index=Index.ANALYZED,store=Store.YES)22. private String description;23.24. // Constructors25.26. /** default constructor */27. public Product() {28. }29.30. /** full constructor */31. public Product(String name, Double price, String brand, String description) {32. = name;33. this.price = price;34. this.brand = brand;35. this.description = description;36. }37.38. // Property accessors39.40. public String getId() {41. return this.id;42. }43.44. public void setId(String id) {45. this.id = id;46. }47.48. public String getName() {49. return ;50. }52. public void setName(String name) {53. = name;54. }55.56. public Double getPrice() {57. return this.price;58. }59.60. public void setPrice(Double price) {61. this.price = price;62. }63.64. public String getBrand() {65. return this.brand;66. }67.68. public void setBrand(String brand) {69. this.brand = brand;70. }71.72. public String getDescription() {73. return this.description;74. }75.76. public void setDescription(String description) {77. this.description = description;78. }79.80.}step3属性文件Product.hbm.xmlJava代码1.<?xml version="1.0" encoding="utf-8"?>2.<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"3."/hibernate-mapping-3.0.dtd">4.<!--5. Mapping file autogenerated by MyEclipse Persistence Tools6.-->7.<hibernate-mapping>8. <class name="com.v512.example.model.Product" table="PRODUCT" >9. <id name="id" type="ng.String">10. <column name="ID" length="40" />11. <generator class="uuid.hex" />12. </id>13. <property name="name" type="ng.String">14. <column name="NAME" length="80" />15. </property>16. <property name="price" type="ng.Double">17. <column name="PRICE" precision="6" />18. </property>19. <property name="brand" type="ng.String">20. <column name="BRAND" length="40" />21. </property>22. <property name="description" type="ng.String">23. <column name="DESCRIPTION" length="2000" />24. </property>25. </class>26.</hibernate-mapping>要使用Compass必须加入一个applicationContext-compass.xml文件,文件名可以自行定义这个就不用说了废话step4applicationContext-compass.xml:Java代码1.<?xml version="1.0" encoding="UTF-8"?>2.3.<beans xmlns="/schema/beans"4. xmlns:xsi="/2001/XMLSchema-instance"5. xsi:schemaLocation=" /schema/beans /schema/beans/spring-beans -2.5.xsd"6. default-lazy-init="true">7.8. <!-- 配置compass的注解功能 -->9. <bean id="annotationConfiguration"10. class="passAnnotationsConfiguration">11. </bean>12.13.14. <bean id="compass" class="pass.spring.LocalCompassBean">15. <!-- 配置需要索引的实体映射文件的路径 -->16. <property name="resourceDirectoryLocations">17. <list>18. <value>classpath:com/v512/example/model</value>19. </list>20. </property>21. <!-- 设置存放索引的路径 -->22. <property name="connection">23. <value>/lucene/indexes</value>24. </property>25.26. <!--配置要搜索的类,作用:会根据以下的类建立索引 -->27. <property name="classMappings">28. <list>29. <value>com.v512.example.model.Product</value>30. </list>31. </property>32. <property name="compassConfiguration"33. ref="annotationConfiguration" />34.35. <!--compass的一些属性设置 -->36. <property name="compassSettings">37. <props>38. <prop key="compass.transaction.factory">39. pass.spring.transaction.SpringSyncTransactionFactory40. </prop>41. <prop key="compass.engine.analyzer.MMAnalyzer.CustomAnalyzer">net.paoding.analysis.analyzer.PaodingAnalyzer </prop>42. </props>43. </property>44. <!--compass的事务管理器 -->45. <property name="transactionManager" ref="transactionManager" />46. </bean>47.48.49. <bean id="hibernateGpsDevice"50. class="pass.gps.device.hibernate.HibernateGpsDevice">51. <property name="name">52. <value>hibernateDevice</value>53. </property>54. <property name="sessionFactory" ref="sessionFactory" />55. <property name="mirrorDataChanges">56. <value>true</value>57. </property>58. </bean>59. <!-- 同步更新索引 -->60. <bean id="compassGps" class="pass.gps.impl.SingleCompassGps"61. init-method="start" destroy-method="stop">62. <property name="compass" ref="compass" />63. <property name="gpsDevices">64. <list>65. <bean66. class="pass.spring.device.SpringSyncTransactionGpsDeviceWrapper">67. <property name="gpsDevice" ref="hibernateGpsDevice" />68. </bean>69. </list>70. </property>71. </bean>72.73.74. <bean id="compassTemplate"75. class="passTemplate">76. <property name="compass" ref="compass" />77. </bean>78.79. <!-- 定时重建索引(利用quartz)或随Spring ApplicationContext启动而重建索引 -->80. <bean id="compassIndexBuilder"81. class="passIndexBuilder"82. lazy-init="false">83. <property name="compassGps" ref="compassGps" />84. <property name="buildIndex" value="true" />85. <property name="lazyTime" value="10" />86. </bean>87.88.89.90.</beans>中间都有注解就不多解释了下面来编写dao及dao的实现以及severce层step5Java代码1.package com.v512.example.dao;2.3.import java.util.List;4.5.import com.v512.example.model.Product;6.7.public interface ProductDao {8. public void create(Product p);9. public Product getProduct(String id);10. public List getProducts();11. public void update(Product product);12. public void remove(String id);13.14.}Java代码1.package com.v512.example.dao.hibernate;2.3.import java.util.List;4.5.import com.v512.example.dao.ProductDao;6.import com.v512.example.model.Product;7.import org.springframework.orm.hibernate3.support.HibernateDaoSupport;8.public class ProductDaoHibernate extends HibernateDaoSupport implements ProductDao {9.10. public void create(Product p) {11. getHibernateTemplate().save(p);12.13. }14.15. public Product getProduct(String id) {16. return (Product)getHibernateTemplate().get(Product.class, id);17. }18.19. public List getProducts() {20. return getHibernateTemplate().find("from Product order by id desc");21. }22.23. public void remove(String id) {24. getHibernateTemplate().delete(getProduct(id));25.26. }27.28. public void update(Product product) {29. getHibernateTemplate().saveOrUpdate(product);30.31. }32.33.}serveceJava代码1.package com.v512.example.service;2.3.import java.util.List;4.5.import com.v512.example.model.Product;6.7.public interface ProductManager {8. public void insertProduct(Product p);9. public Product findProdcut(String id);10. public List searchProducts(String queryString);11.12.13.}servece的实现Java代码1.package com.v512.example.service.impl;2.3.import java.util.ArrayList;4.import java.util.List;5.6.import passHits;7.import passSession;8.import passTemplate;9.import passTransaction;10.11.import com.v512.example.dao.ProductDao;12.import com.v512.example.model.Product;13.import com.v512.example.service.ProductManager;14.import pass;15.public class ProductManagerImpl implements ProductManager {16. private ProductDao productDao;17. private CompassTemplate compassTemplate;18.19.20.21.22. public void setCompassTemplate(CompassTemplate compassTemplate){23. passTemplate=compassTemplate;24. }25.26. public void setProductDao(ProductDao productDao){27. this.productDao=productDao;28. }29.30. public Product findProdcut(String id) {31. return productDao.getProduct(id);32. }33.34. public void insertProduct(Product p) {35. productDao.create(p);36. }37.38. public List searchProducts(String queryString) {39. Compass compass = compassTemplate.getCompass();40. CompassSession session=compass.openSession();41. List list = new ArrayList();42. //这里不需要开启事务了,因为在调用这个方法之前就已经开启了事务43. CompassHits hits= session.queryBuilder().queryString("name:"+queryString).toQuery().hits();44. System.out.println("queryString:"+queryString);45. System.out.println("hits:"+hits.getLength());46. for(int i=0;i<hits.length();i++){47. Product hit=(Product)hits.data(i);48. list.add(hit);49. }50.51. return list;52. }53.54.55.56. public CompassTemplate getCompassTemplate() {57. return compassTemplate;58. }59.60.}所有的都做完了现在编写jsp页面step6insertProduct.jspJava代码1.<%@ page language="java" contentType="text/html; charset=UTF-8"2. pageEncoding="UTF-8"%>3.<%@ taglib prefix="s" uri="/struts-tags"%>4.<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""/TR/html4/loose.dtd">5.<html>6.<head>7.<meta http-equiv="Content-Type" content="text/html; charset=utf-8">8.<link href="style/oa.css" rel="stylesheet" type="text/css"> 9.10.<title>添加信息</title>11.</head>12.<body>13.<center>14. <s:form action="insert.action" theme="simple">15.16.<TABLE class="tableEdit" border="0" cellspacing="1" cellpadding="0" style="width:300px;">17. <TBODY>18. <TR>19. <td align="center" class="tdEditTitle">添加商品名称</TD>20. </TR>21. <TR>22. <td>23.24.25.<table class="tableEdit" style="width:300px;" cellspacing="0" border="0" cellpadding="0">26. <tr>27. <td class="tdEditLabel" >商品名称</td>28. <td class="tdEditContent"><s:textfield name="product.name" label="名称" /></td>29. </tr>30.31. <tr>32. <td class="tdEditLabel" >商品品牌</td>33. <td class="tdEditContent"><s:textfield name="product.brand" label="品牌" /></td>34. </tr>35.36. <tr>37. <td class="tdEditLabel" >商品价格</td>38. <td class="tdEditContent"><s:textfield name="product.price" label="价格" /></td>39. </tr>40.41. <tr>42. <td class="tdEditLabel" >商品描述</td>43. <td class="tdEditContent"><s:textarea name="product.description" label="描述" />44. </td>45. </tr>46. <tr>47. <td> 48. </td>49. <td><s:submit/>50. <br></td>51. </tr>52.</table>53. </td>54. </TR>55. </TBODY>56.</TABLE>57.</s:form>58.</center>59.</body>60.</html>step7编写actionJava代码1.package com.v512.example.action;2.3.import java.util.List;4.5.import com.opensymphony.xwork2.ActionSupport;6.import com.v512.example.model.Product;7.import com.v512.example.service.ProductManager;8.import org.apache.struts2.ServletActionContext;9.10.public class ProductAction extends ActionSupport {11.12. private static final long serialVersionUID = 3795048906805728732L;13. private ProductManager productManager;14. private Product product;15. private String queryString;16.17. public void setQueryString(String queryString){18. this.queryString=queryString;19. }20.21. public Product getProduct() {22. return product;23. }24.25. public void setProduct(Product product) {26. this.product = product;27. }28.29. public void setProductManager(ProductManager productManager){30. this.productManager=productManager;31. }32.33. public String insert(){34. productManager.insertProduct(product);35. return SUCCESS;36. }37. public String search(){38. List results=productManager.searchProducts(queryString);39. System.out.println(results.size());40. ServletActionContext.getRequest().setAttribute("searchresults", results);41. return SUCCESS;42. }43.44.45.}step8关于Struts2的配置文件如下Java代码1.<?xml version="1.0" encoding="UTF-8" ?>2.<!DOCTYPE struts PUBLIC3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"4. "/dtds/struts-2.0.dtd">5.6.<struts>7. <constant name="struts.objectFactory" value="spring" />8.9. <include file="struts-default.xml"/>10.11. <package name="product" extends="struts-default"12. namespace="/product">13.14. <!-- 配置Struts2的Action,class值要与applicationContext*.xml中的id的值一致。
基于JAVA技术搜索引擎的设计与实现
作者:刘智勇
来源:《数字技术与应用》2017年第05期
摘要:随着科技的进步与发展,互联网成为21世纪的宠儿,网络信息也复杂多样。
这些繁杂的网络信息在给我们带来便利的同时也产生了极大的问题,比如如何在这海量的信息里面找到自己所需要的内容,成为当前互联网技术的热门领域。
互联网信息复杂多样,因此想要迅速、快捷的找到所需要的信息内容,就需要搜索引擎来帮忙实现。
本文就对搜索引擎的工作原理,组成和数据结构等方面进行分析,对搜索引擎未来的发展方向进行探索。
众所周知,智能化是未来的一个大的趋势,想要实现搜索引擎的智能化,就需要使搜索引擎具备自我学习的能力,适应用户的查询需求。
关键词:搜索引擎;智能化;信息检索
中图分类号:TP391.3 文献标识码:A 文章编号:1007-9416(2017)05-0205-01
1 搜索引擎概述
随着信息时代的来临,互联网的迅速普及应用,已经成为我们正常生活中不可或缺的一部分。
因为互联网信息具备共享等多种特性,使得网络信息成倍的增加。
谷歌公司所收录的网页信息都已经过亿,而且每天还在不断的攀升,想要在这么多数据里面,选取对自己有用的信息,就需要借助搜索引擎来进行实现。
搜索引擎是从1994年诞生,随着互联网的信息日益增多,搜索引擎也在不断的发展,从1994年到现在历经三个阶段。
搜索引擎的第一个阶段就是1994年到1996年,这个阶段的搜索引擎以集中式检索为主。
当时网络信息并没有很多,一般都是少于百万的网页,也没有索引,检索速度也非常慢。
也是采用网络、数据库等关键技术来实现。
第二个阶段是1996年到1998年,这个期间,搜索引擎采用分布式检索方案,使用多个微型计算机来协同工作,其目的是为了提高数据规模和响应速度。
一般可以响应千万次的用户检索请求。
第三代搜索引擎,就当前所使用的搜索引擎,也是搜索引擎极为繁荣的时期。
它拥有完整的索引数据库,除了一般的搜索,还有主题搜索和地域搜索。
但是这些搜索结果反馈给用户的数据量较大,检索结果的相关度又成为研究的核心。
我们通常所用的搜索引擎也分为多种,按照信息的搜集方法和服务提供方式的不同进行区分,常用的有三类,第一,目录式搜索引擎。
它是以人工方式进行信息的搜集,由编辑员进行审查并制作成信息摘要,将其进行分类置入架构中去。
这类搜索方式的搜索结果准确,信息质量高,但是需要大量的人工成本,信息更新不及时,维护量大。
第二,机器人搜索引擎。
就是我们常说的网络爬虫,是由一个网络蜘蛛的机器人程序以某种策略自动地在互联网中搜集和发
现信息,这种信息查询方式是由索引器完成的。
索引器为搜集到的信息建立一个完整的索引,根据用户所输入的关键词,对索引库进行检索,从而查询到信息并将信息反馈给用户。
这种检索方式,可以保证数据的及时更新,减少人工成本,但是返回的信息很多,相关度不高。
第三,元搜索引擎。
这类搜索引擎比较奇怪,没有自己的数据信息,而是根据用户输入的查询关键字向其他搜索引擎发出请求,由其他搜索引擎来完成,并且将返回的结果进行筛选,排序处理,然后将这些信息作为自己的结果反馈给用户。
2 搜索引擎的系统架构
一般来说,搜索引擎的工作流程分为四步,从网上抓取网页,建立索引数据库,根据用户的关键词在索引数据库中进行搜索,对搜索结果进行相关度排序处理。
它主要由网络蜘蛛、索引器和检索器三部分组成。
网络蜘蛛,英文名称Web Spider,它的主要功能是从指定的IP出发,便利整个互联网中所存在的网页,它可以借助网页中的URL爬到其他网页中去,不停的对这个过程进行重复,将爬过的网页搜集起来并存储到页面存储库中去。
Indexer,索引器,它的主要功能是将Web Spider收集回来的网页进行分析,提取网页中所含的信息,并按照相关度进行计算,将这些相关信息建立完整的网页索引数据库。
Searcher,检索器,用户输入关键词进行搜索,它负责对关键词进行分解,根据搜索器从网页索引数据库中查询到相关度较高的网页,对其进行排序处理,然后交给系统,系统会把结果进行组织处理,反馈给用户。
搜索引擎对于文件的存储要求较高,操作系统又有自身的缺陷,在大型文件的管理方面存在诸多局限,这就需要搜索引擎自行定义和管理大型文件系统。
大型文件是一种跨多文件系统的虚拟文件,支持64位寻址方式,可自动处理多文件系统的分配和寻址。
3 搜索引擎的软件实现
利用Java技术对搜索引擎的三个主要部件进行实现,能够完成搜索引擎的基本功能。
在进行软件开发前期,要进行Java开发环境的搭建,需要Java程序开发包,Java 2Platform Standard Edition5.0,实现索引和搜索的Java类库,Lucene1.4.3,还有Servlet/JSP容器,Tomcat 5.5。
下面对搜索引擎所用到的Java相关技术进行介绍。
3.1 Java的Internet链接技术
Web Spider为了抓取网页,其主要原因是它能够与Web服务器通信,进行网页的下载。
Java提供诸多支持Internet链接的类库,即套接字类和与URL地址一起工作的URL类库。
套接字就是我们常说的端口,它们都有自己的端口号,端口号与链接相互通信,客户端程序制定端口号发送链接请求。
而Java中定义Socket和ServerSocket两个类,在套接字程序设计中较为常用。
Socket类可以声明客户端套接字,ServerSocket声明服务端套接字,建立点对点的链接。
在建立之前,服务端在监听,客户端在请求,一旦链接建立完成,使用I/O流来进行二者
之间的通信。
而URl类允许解析URL,为它创建一个对象,将其解析为主机名和路径,除此之外,URL类还具有打开地址链接的能力,从而实现URL的信息检索能力。
3.2 Java中的中文处理和多线程机制
搜索引擎的工作流程就是网页的抓取、索引、搜索结果输出,当然在这些过程中都遇到了汉字乱码的问题。
目前Java很好的支持汉字,在中文处理方面也非常的优秀,前提条件是需要设置正确的编码方式。
而且在搜索引擎的工作过程中都是以多线程的机制运行,可以提高工作效率。
Java中提供两种办法来进行多线程的操作。
第一种方法就是继承Thread对象,封装线程,在用run方法来为特定的线程提供代码。
但是Java不支持多继承,当它需要继承其他类时,这个方法就行不通。
那么可以试试第二种办法,就是执行Runnable接口,在类里面建立Run方法,这样就可以解决第一种方法的限制。
3.3 Lucene实现索引和搜索
Lucene是一种高性能的Java库,而且易于扩展,可以利用其中的Java类在程序中增加索引和搜索功能。
Lucene可以添加索引和搜索功能到应有程序中,并且通用性好,支持多种文本格式数据,因为它不关心数据的来源、格式和语言,只要是能转换成文本,都可以利用Lucene来进行索引和搜索。
而且它还可以索引存储在数据库中的数据,实现全文检索。
提供核心类,可以在应用程序中很是方便的加入索引和搜索功能。
4 结语
搜索引擎的基本功能都可以利用Java进行实现,而且极为方便。
本文构建的Web Spider 利用队列和多线程机制,使得搜索引擎具备较高的搜索效率,较好的支持中文。
通过这次设计与实现,对搜索引擎的工作原理和整体架构有了一个较为全面的认识。
参考文献
[1]唐陪和,杨新论,刘浩.Google搜索引擎剖析[J].情报检索,2004,(8):88-90.
[2]印鉴,陈忆群,张钢.搜索引擎技术研究与发展[J].计算机工程,2005,(14).
[3]孙西全,马瑞芳,李燕灵.基于Lucene的信息检索的研究与应用[J].情报理论与实践,2006,01.。