基于asp的搜索引擎开发和实现
随着因特网的迅猛发展、WEB信息的增加,用户要在信息海洋里查找信息,就像大海捞针一样,搜索引擎技术恰好解决了这一难题。目前,搜索引擎系统可以分类三大类,分别是:目录式搜索引擎:以人工方式或半自动方式搜集信息,由编辑员查看信息之后,人工形成信息摘要,并将信息置于事先确定的分类框架中;机器人搜索引擎:由一个称为蜘蛛的机器人程序以某种策略自动地在互联网中搜集和发现信息,由索引器为搜集到的信息建立索引,由检索器根据用户的查询输入检索索引库,并将查询结果返回给用户;元搜索引擎:这类搜索引擎没有自己的数据,而是将用户的查询请求同时向多个搜索引擎递交,将返回的结果进行重复排除、重新排序等处理后,作为自己的结果返回给用户。
1.2搜索引擎的发展方向
搜索引擎已成为一个新的研究、开发领域。因为它要用到信息检索、人工智能、计算机网络、分布式处理、数据库、数据挖掘、数字图书馆、自然语言处理等多领域的理论和技术,所以具有综合性和挑战性。又由于搜索引擎有大量的用户,有很好的经济价值,所以引起了世界各国计算机科学界和信息产业界的高度关注,目前的研究、开发十分活跃,并出现了很多值得注意的方向:
1.十分注意提高信息查询结果的精度,提高检索的有效性。用户在搜索引擎上进行信息查询时,并不十分关注返回结果的多少,而是看结果是否和自己的需求吻合。
2.基于智能代理的信息过滤和个性化服务。信息智能代理是另外一种利用互联网信息的机制。它使用自动获得的领域模型(如Web知识、信息处理、与用户兴趣相关的信息资源、领域组织结构)、用户模型(如用户背景、兴趣、行为、风格)知识进行信息搜集、索引、过滤(包括兴趣过滤和不良信息过滤),并自动地将用户感兴趣的、对用户有用的信息提交给用户。
3.采用分布式体系结构提高系统规模和性能。搜索引擎的实现可以采用集中式体系结构和分布式体系结构,两种方法各有千秋。但当系统规模到达一定程度(如网页数达到亿级)时,必然要采用某种分布式方法,以提高系统性能。
4.重视交叉语言检索的研究和开发。交叉语言信息检索是指用户用母语提交查询,搜索引擎在多种语言的数据库中进行信息检索,返回能够回答用户问题的所有语言的文档。如果再加上机器翻译,返回结果可以用母语显示。该技术目前还处于初步研究阶段,主要的困难在于语言之间在表达方式和语义对应上的不确定性。
2系统开发技术分析
通过基于Internet互联网的动态WEB数据库技术,可以解决远程的数据传输与读取,远程的客户终端可以通过WEB页面提交请求,查询远端的数据服务器上的信息,同时还可以向远端数据服务器的数据库中存储信息以实现信息的共享,同时利用Internet技术可以降低软件的开发和部署成本,只要在服务器端安装WEB应用就可以使每个客户端都能浏览使用。
2.1系统开发环境
本搜索引擎系统是一个B/S结构的系统,它的发布需要有WEB服务器的支持,且需要数据库系统来方便的对系统数据进行存储,查询,修改,删除,及时更新系统信息,同时需要一种简单,方便的编程工具可以与数据库进行交互。鉴于上述需求我选择IIS 5.0+SQL Server2000+ASP作为我的开发环境。
2.2 IIS简介
系统设计IIS是Internet信息服务(Internet Information Server)的缩写,它是一种Web服务,主要包括WWW服务器、FTP服务器等,使得在Intranet(局域网)或Internet(因特网)上发布信息成了一件很容易的事。WWW服务提供维护网站和网页,并回复基于浏览器的请求。有了WWW服务和它内置的功能,通过Internet信息服务器可以创建各种各样的Internet应用程序,加上其内置的对数据库连接的支持,IIS的功能就更强大。SQL数据库信息或其他任何符合ODBC的数据库信息都能在Internet/Intranet上灵活应用。
2.3 SQL SERVER 2000简介
SQL Server 2000具有构成最大的Web站点的数据存储组件所需的可伸缩性、可用性和安全功能。它支持English Query和Microsoft搜索服务等功能,在Web应用程序中包含了用户友好的查询和强大的搜索功能。同一个数据库引擎可以在不同的平台上使用,SQL Server 2000企业版支持联合服务器、索引视图和大型内存支持等功能,使其得以升级到最大Web站点所需的性能级别。SQL Server 2000关系数据库引擎支持当今苛刻的数据处理环境所需的功能,同时将管理上千个并发修改数据库的用户的开销减到最小。SQL Server 2000中包括一系列管理和开发工具,这些工具可改进在多个站点上安装、部署、管理和使用SQL Server的过程。
2.4 ASP简介
ASP全称为Active Server Pages,即动态服务器页面,它是一套微软开发的服务器端脚本环境,ASP内含于IIS 3.0 以上版本中,通过ASP我们可以结合HTML网页、ASP指令建立动态、交互且高效的Web服务器应用程序。ASP脚本在服务器端解释执行,结果自动生成符合HTML语言的主页去响应用户的请求。ASP已成为目前应用最广泛的动态网页开发工具,同时应用ASP进行网络化的信息管理系统也逐步得到推广。ASP本身并不是一种脚本语言,它只是提供了一种使镶嵌在HTML页面中的脚本程序得以运行的环境。ASP程序其实是以扩展名为.asp的纯文本形式存在于Web服务器上的,可以用任何文本编辑器打开它。ASP程序中可以包含纯文本、HTML标记以及脚本命令。用户只需将.asp程序放在Web服务器的虚拟目录下(该目录必须要有可执行权限),就可以通过WWW的方式访问ASP程序了。
3概要设计
3.1需求分析
随着互联网信息的增长,人们对信息资料的查阅已不满足现有的书籍资料,网上搜索信息资料扮演着越来越重要的角色。本系统模块设计目标是采用后台数据信息录入,前台动态页面查找的方式来实现对信息的搜索。本系统充分考虑了系统的可扩展性和搜索引擎特有的查询流程,利用ASP基本知识以及Microsoft SQL Server 2000的基本操作,使它具有良好的稳定性并且便于维护。
3.2数据库设计
3.2.1分类目录数据库表
分类目录数据库表在数据库中标记的是Sort数据表,它记录的是子类信息,包括子类名称、父类ID和是否在首页显示。Sort表的具体结构如表1所示:
表1 sort表
字段名称 | 数据类型 | 说明 | 主关键字 |
ID | int | 编号 | * |
Sort | varchar | 子类名称 | |
Sort-ID | int | 父类ID | |
Show | int | 是否在首页显示 |
3.2.2网站登录信息数据库
网站登录数据信息数据库在数据库中标记的是Web数据表,它记录的是网站名称、网站内容简介、网站地址、是否审核、网站关键字、联系人姓名、联系人E-mail、联系人qq号码、联系人地址、联系人邮政编码、网站登录时间、网站访问次数、所属子类名称、子类路径和所属子类ID。Web表的具体结构如表2所示:
表2 web表
字段名称 | 数据类型 | 说明 | 主关键字 |
ID | int | 编号 | * |
Title | varchar | 网站名称 | |
Content | varchar | 网站内容简介 | |
URL | varchar | 网站地址 | |
Verify | char | 管理员是否已经确认 | |
Keyword | varchar | 网站关键字 | |
Name | varchar | 联系人姓名 | |
| varchar | 联系人E-mail | |
| varchar | 联系人qq | |
Address | varchar | 联系人地址 | |
PostCode | varchar | 联系人邮政编码 | |
Time | datetime | 网站登录时间 | |
Click | int | 网站访问次数 | |
Sort | varchar | 子类名称 | |
Sort_path | varchar | 子类路径 | |
Sort_ID | int | 子类ID | |
3.2.3管理员数据库表
管理员数据表即:数据表Admin,记录的是管理员的登录名和密码。具体结构如表3所示:
表3 Admin表
字段名称 | 数据类型 | 说明 | 主关键字 |
ID | int | 编号 | * |
UserName | varchar | 管理员登录名 | |
Password | varchar | 管理员密码 |
3.2.4关键字记录数据库表
关键字记录表即Keyword数据表,记录关键字信息,包括关键字和输入次数,具体结构如表4所示:
表4 Keyword表
字段名称 | 数据类型 | 说明 | 主关键字 |
ID | int | 编号 | * |
keyword | varchar | 关键字 | |
hot | int | 输入次数 |
3.3系统设计结构图
系统设计结构如图1所示:
系统前台模块设计
4.1网站搜索模块的实现
4.1.1 功能描述
用户访问系统时,首先接触到的是首页面index.asp,它提供了到达5个功能模块的超链接,默认显示为网站搜索模块。另外页面还提供一个表单from,让用户输入要搜索的关键字,当用户输入关键字单击搜索按钮后,表单中的数据将被提交到search.asp文件中处理。在search.asp首先读取传递过来的数据,然后判断该数据是否为空。如果不为空。则将数据分割为多个关键字,然后在数据库中查找匹配的记录,并在页面上显示。
4.1.2 流程图
在网站搜索模块中,数据流程如图2所示:
4.1.3 界面设计
搜索模块的界面设计如图3所示:
4.1.4 工作流程和代码设计
输入关键字后,数据被提交到search.asp中,首先使用Request对象的QueryString()方法读取表单传递过来的关键字,再判断关键字是否为空,若不为空,将多个关键字进行处理后分开保存在一维数组中:
keyword = replace(keyword,"'"," ") '用空格替换关键词中的字符"'"
keyword = replace(keyword,"["," ") '用空格替换关键词中的字符"["
keyword = replace(keyword,"]"," ") '用空格替换关键词中的字符"]"
keyword = replace(keyword,","," ") '用空格替换关键词中的中文字符","
keyword = replace(keyword,","," ") '用空格替换关键词中的英文字符","
keyword=ltrim(rtrim(keyword)) '去掉关键词左边和右边的空格。函数LTrim 去掉字符串左边空格,函数RTrim 去掉字符串右边空格
keywordlist=split(keyword) '将用户输入的关键词用空格分成多个关键词并保存在一维数组keywordlist中
然后在循环写出查询的spl语句:
if path="" or sort_path="/0/" then
search_sql="verify=0 and ("&sql&") order by click desc"
else
search_sql="sort_path like '%" & sort_path & "%' and verify=0 and ("&sql&") order by click desc"
end if
rs.open
"selectid,sort_path,sort_id,title,keyword,url,content,address,postcode,verify,click from web where "&search_sql,conn,1,1
执行查询。使用html代码显示查询页面的网站搜索部分,然后判断是否存在满足条件的记录,如果存在,则使用showcontent()过程显示满足条件的所有记录,并将记录中的关键字用红色字体显示。然后使用showpage()过程显示记录的页数信息,包括当前页、总页数等。最后显示查询页面的底部的管理入口,并建立到管理员登录的超连接。
4.2 分类目录模块的实现
4.2.1 功能描述
分类目录界面由dir.asp实现,在该页面显示的分类信息包括sort_id=0的分类和sort_id=1的分类,即最上级分类和要求显示在首页上的下级分类。例如,如果把“计算机”作为最上级分类。“计算机”又分为以下3类:软件、硬件和网络。设置这3个分类也显示在首页上,即show=1。这3个分类的下一级分类不在首页上显示。当单击分类目录首页上的某分类时,将进入list.asp文件,在该文件中,将详细显示这一分类及其下级分类,并显示属于这一分类的所有网站信息。
4.2.2 工作流程和代码设计
单击分类目录首页上的某一分类,进入list.asp文件,在该文件中,首先使用Request对象的QueryString()方法读取sort_id的值并在数据库中查找这一分类的所有上级分类,并连接在一起,其逐级显示分类的代码如下:
locality=" >> "&sort '要在网页上显示的逐级分类,如计算机>>软件>>编程语言
if sort_id<>0 then 'sort_id <> 0 表示该类存在上级分类
for i=1 to 8 '8表示在本系统中分类只有8级
set rs=conn.execute("select * from sort where id="&sort_id)
if rs.eof and rs.bof then
else
sort=rs("sort")
locality=">>
<a href=list.asp?sort_id="&sort_id&">"&sort&"</a>"&locality
sort_id=rs("sort_id") '上一层分类的id
end if
rs.close
set rs = nothing
next
end if
若该分类还存在下级分类,将显示下级分类,最后显示属于这一分类的所有网站信息,在显示网站信息的代码中,用到了两个过程:showcontent()过程和showpage()过程。Showcontent()过程显示所有满足条件的记录。Showpage()过程显示页数信息,包括当前页、总页数等,其中过程showpage()的处理代码如下:
Function showpage(totalnumber,maxperpage,filename) '定义过程
Dim n
If totalnumber Mod maxperpage=0 Then 'totalnumber能够整除maxperpage
n= totalnumber \ maxperpage
Else 'totalnumber不能够整除maxperpage
n= totalnumber \ maxperpage+1
End If
If CurrentPage<2 Then '当前页是第一页
%>
第一页 上一页
<%
Else '当前页不是第一页
%>
<a href="<%=filename%>?sort_id=<%=rqid%>&page=1">第一页</a> <a href="<%=filename%>?sort_id=<%=rqid%>&page=<%=CurrentPage-1%>">上一页</a>
<%
End If
If n-currentpage<1 Then '总页数小于或等于当前页
%>
下一页 最后一页
<%
Else '总页数大于当前页
……
End If
%>
共<%=totalnumber%>个网站 页次:<%=CurrentPage%>/<%=n%>页
4.3网站登录模块的实现
4.3.1 功能描述
网站登录页面为jion.asp,在网站登录模块,包含一个表单,用于网站联系人输入网站和个人信息,在表单中,包含输入网站信息的文本域。其中。显示分类目录的文本域为sort_id,它为只读类型,只能单击文本域右边的“选择分类”按钮来输入,当网站联系人输入所有的信息,并单击“确定”按钮,然后判断用户输入的分类目录是否存在,如果存在,则生成输入网站的最终分类目录。接着再判断用户输入的网站网址是否已经保存在数据库中,如果没有保存在数据库中,则在数据库中插入一条新的记录。如果数据库中已经存在该网址,则给出提示,并返回到前一页,当所有的数据保存在数据库中之后,页面上显示网站登录成功的提示。
4.3.2 数据流程图
网站登录的数据流程图如图4:
4.3.3 工作流程
当网站联系人输入所有的信息提交后,表单中的数据首先在check()过程中检查其合法性。如果合法,数据将被提交到join_ok.asp文件中处理,在该文件中将使用Request对象的From()方法获取网站登录数据,然后判断用户输入的分类目录是否存在,如果存在,则生成输入网站的最终分类目录,接着再判断用户输入的网站网址是否已经保存在数据库中,如果没有保存在数据库中,则在数据库中插入一条新的记录:
rs.addnew '插入新记录
rs("sort")=path '子类名称
rs("sort_path")=path_id '子类id 路径
rs("sort_id")=sort_id '父类id
rs("title")=request.form("title") '网站名称
rs("url")=request.form("url") '网站网址
rs("keyword")=request.form("keyword") '关键字
rs("content")=request.form("content") '网站描述
rs("name")=request.form("name") '联系人姓名
rs("email")=request.form("email") '联系人email
if oicq="" then 'qq为空
rs("oicq")=null
else
rs("oicq")=oicq 'qq
end if
rs("address")=request.form("address") '联系人地址
rs("postcode")=request.form("postcode") '邮政编码
rs("verify")="-1" '-1表示为审查
rs("click")="0" '点击次数
rs("time")=date() '登录时间
rs.update '更数数据库
rs.close '关闭RecordSet 对象
end if
set rs=nothing
如果数据库中已经存在该网址,则给出提示,并返回到前一页。当所有的数据保存到数据库中后,页面上将显示登录成功的提示。
4.4 网站修改模块
4.4.1 功能描述
网站修改页面为admin.asp。在网站修改页面上,包含两个表单。一张表单用来输入网站搜索的关键字,实现的功能与网站搜索模块一样。另一张表单是网站联系人登录时输入姓名和电子邮箱,在该表单中,输入联系人的姓名的文本域为name,输入联系人电子邮箱的文本域为email。当网站联系人输入姓名和电子邮箱,单击“登录”按钮后,表单的数据将被提交到login.asp文件中处理,当网站联系人输入修改的信息。并单击“确定”按钮后,所有的数据提交到join_edit_ok.asp文件中,该文件将所有的数据保存在数据库中。并在页面上显示网站修改成功的信息。
4.4.2 工作流程图
网站修改的工作流程如图5所示:
4.4.3 界面设计
在首页页面或者分类目录页面或登录页面上单击“网站修改”超连接,首先进入网站修改登录页面,在该页面上输入网站登录时填写的联系人姓名和联系人电子邮件。单击“登录”按钮既可进入网站修改页面。网站修改页面也分两部分:上面为网站搜索部分,下面为网站信息修改部分。在信息修改部分,网站联系人可以修改输入的网站信息。网站修改的设计界面如图6所示:
4.4.4 工作流程和代码设计
在表单中输入联系人名称以及邮箱后,数据被提交到login.asp文件中处理,在login.asp中首先使用QueryString()方法读取action的值,如果action的值为login,则读取表单传递过来的联系人姓名和电子邮箱数据,并判断联系人姓名和电子邮箱是否为空:
if name="" then
response.write "<Script>window.alert('联系人不能空');_
history.back();</Script>"
else
if email="" then
response.write"<Script>window.alert('电子邮箱不能为空 ');_
history.back();</Script>"
如果二者都不为空,则从数据库中查询email列的值为输入电子邮箱的记录。如果存在记录,则判断输入的用户名是否正确,如果不正确,返回到登录页面。如果全部正确,则登录成功,保存联系人登录的电子邮箱和id,并将页面转到jion_edit_ok.asp修改页面。进行网站登录信息的修改。
5系统后台模块设计
5.1 网站管理模块的实现
前台页面可以看成是对数据库中表的查询,读入,而后台则是对数据库表中的信息进行修改,添加,删除,从而改变前台的显示信息。后台由管理员通过管理员id和密码登录进行操作。
5.1.1 功能描述
管理员登录之后,首先进入的就是网站管理模块,该模块管理员能够对已审核的网站进行修改和删除操作。网站管理模块的界面如图7:
5.1.2 工作流程和代码设计
进入该界面时,程序首先从数据库中查询verify=0的记录,然后将所有的记录分页显示在页面上。当管理员单击某个网站对应的“删除”超连接,就可以将该网站及其所有信息从数据库中删除。执行删除文件的部分代码如下:
response.write"<Script>window.alert('你目前还没登录,请先登录!');_
location.replace('index.asp');</Script>"
If Request("action")="delete" Then
delid=replace(request("id"),",","") '获得要删除记录的id,Replace 过程将获得的id 字符串中的"'"用空字符""替换
if delid="" or isnull(delid) then '要删除的记录id 为空
response.write "<script>alert('操作失败,没有选择合适参数,请单击确定返回!');</script>"
response.redirect "main.asp" '返回到网站管理界面
'执行数据库中的删除操作,删除数据库中id 列的值在delid数组中的记录
conn.Execute("delete * from web where ID in ("&delid&")")
response.write "<script>alert('留言删除成功,请单击确定返回!');</script>"
5.2 网站审核
网站审核模块与网站管理模块非常相似。不同的地方在于,网站审核模块显示的所有网站均为未审核网站,已经审核了的网站将不会在此页面显示。而网站管理模块显示的是已审核网站,网站审核模块查询数据库的代码如下:
Set rs=server,createobject(“adodb.recordset”)
rs.open”select id,sort_id,title.url.verify.click.time.from web where verify=-1 order by id desc”.conn,1,1
5.3 分类管理模块
5.3.1 分类编辑
在分类显示界面的每个分类的下面,对应着一个“编辑”超连接,单击该超连接,进入该分类的编辑界面,分类编辑界面和分类添加界面相同,二者的界面是由同一个文件生成,进入某一分类的界面,则在界面上显示该分类保存在数据库中的信息。当用户输入修改后的信息,单击确定按扭,所有的数据将被提交到sort_ok.asp文件中处理,部分处理代码如下:
case "edit" 'action 的值为edit
show=request.form("show") '是否首页显示
sort_id=request.form("sort_id") '上级ID
set rs=server.createobject("adodb.recordset") '创建RecordSet 对象
'从数据库中查询id 列的值为request.form("id")的记录,将结果保存在rs 中
rs.open "select * from sort where id="&request.form("id"),conn,1,3
rs("sort")=request.form("sort") '分类名称
………
rs.update '更新数据库
rs.close '关闭RecordSet 对象
if sort_id="0" then '判断sort_id 的值,并根据sort_id 的值返回到不同的界面
response.write "<Script>window.alert('分类修改成功');location.replace('sort_manage.asp');</Script>"
else
response.write "<Script>window.alert('分类修改成功');location.replace('sort.asp?sort_id="&sort_id&"');</Script>"
end If
5.3.2 分类添加
在分类显示界面的最下方,有一个“添加分类”超连接。单击该超连接,能够添加当前分类的下一层分类。界面中包含表单forms,用来输入要添加的分类信息。表单中定义的分类名称文本域为sort。首页显示为一个下拉列表show。可以选择是否要在首页显示,默认为否,上级id文本域为sort_id。操作文本域为action。它为只读型,当操作为添加时,文本域中显示“add”。表单中还定义了一个隐藏域id,用来保存当前分类的id。其页面显示如图8所示:
当输入要添加的分类信息并单击“确定”按钮后,表单中的数据被提交到sort_ok.asp文件中处理。在sort_ok.asp文件中,首先判断用户是否登录,如果登录,则读取操作action的值,如果action的值为add,则执行添加处理。分类添加的部分代码如下:
action = request("action")h '读取action 的值
select case action 'select条件语句
case "add" 'action 的值为add
show=request.form("show") '是否首页显示
sort_id=request.form("sort_id") '上级ID
set rs=server.createobject("adodb.recordset") '创建RecordSet 对象
'从数据库中查询id 为空的记录,将结果保存在rs 中
rs.open "select * from sort where id is null",conn,1,3
rs.addnew '添加新记录
rs("sort")=request.form("sort") '分类名称
if show="" then '首页显示,0为首页不显示,1为首页显示
rs("show")="0"
else
rs("show")=show
end If
if sort_id="" then '上级ID的值,为空表示最上层分类
rs("sort_id")="0"
else
rs("sort_id")=sort_id
end If rs("sort_id")=sort_id
end If
rs.update '更新数据库
rs.close '关闭RecordSet 对象
Set rs=nothing
if sort_id="" or sort_id = "0" then '判断sort_id 的值,并根据sort_id 的值返回到不同的界面
response.write"<Script>window.alert('分类添加成功');_
location.replace('sort_manage.asp');</Script>"
else
response.write "<Script>window.alert(‘分类添加成功');_
location.replace('sort.asp?sort_id="&sort_id&"');</Script>"
end If
5.3.3 分类删除
删除操作也是在sort_ok.asp文件中执行的。在sort_ok.asp文件中,如果读取action的值为delete,则执行删除操作,在代码中,首先读取id和sort_id的值,然后执行del()过程将所有相关分类删除,最后根据sort_id的值将页面转到相关页。其中del()过程是一个递归过程,其基本思想是:首先判断该分类是否是最下级分类,如果是,则直接删除改分类,完成操作。如果不是最下级分类,则查询该分类的下级分类,对每一下级分类,执行与该分类同样的操作,即首先根据情况处理。最后直到所有的下级分类以及下级分类的下级分类等都删除掉,然后再将该分类删除。del()的具体代码如下:
Function Del(sort_id,id)
Set drs = Server.CreateObject("ADODB.RecordSet")
drs.Open "Select * from sort where sort_id="&id,conn,1,3
If drs.EOF or drs.BOF Then '不存在满足条件的记录,即该分类是最下级分类
conn.Execute("delete * from sort where ID="&id) '删除该分类
Exit Function '跳出Function 过程
Else '还存在下级分类
Do While Not drs.EOF '循环处理每一个下级分类
nid = drs("id") '下级分类的id
Del id,nid '删除该下级分类
drs.MoveNext '指向下一条记录
Loop
End If
drs.Close '关闭RecordSet 对象
Set drs = nothing
conn.Execute("delete * from sort where id="&id) '删除该分类
End Function
6系统性能测试
6.1 系统测试环境
本系统测试环境:CPU PⅢ,内存SDRAM 128M,SQL SERVER 2000,WIN2000/XP,2003下均测试通过。建议用户CPU PⅣ,内存256M及以上,数据库版本SQL SERVER 2000,WIN2000PRO/XP、2003,WIN2000 SERVER及以上软硬件平台使用。
6.2 测试结果
在系统的各个模块设计完成之后,需要对整个系统进行全面的测试。目的是让整个系统能够快速、稳定、安全的运行。在进行系统测试过程中会出现如下几种情况:
(1)及时的捕捉数据库连接和关闭异常。
(2)对数据库查询操作异常进行捕捉。
(3)对数据库插入操作异常进行捕捉。
(4)对数据库更新操作异常进行捕捉。
(5)对数据库添加操作异常进行捕捉。
(6)对数据库删除操作异常进行捕捉。
结 论
本文通过对搜索引擎的认识和发展现状的分析,从理论联系实际,完成了基于ASP的搜索引擎的开发,系统主要实现了用户对信息的检索。以及给定关键字,根据关键字所属的分类来细分,最后再查找到相关的信息,同时,系统还提供了网站登录,在网站登录模块,登录的用户需要输入登录网站名称、关键字、选择网站所属的分类、最后输入登录者的个人信息。在网站修改模块,输入登录时填写的用户名和邮箱。登录成功后,对输入的网站信息进行修改。唯一不足的是:信息的搜索能力的大小取决于网站登录录入数据的多少。
相关文章:

基于asp的搜索引擎开发和实现
随着因特网的迅猛发展、WEB信息的增加,用户要在信息海洋里查找信息,就像大海捞针一样,搜索引擎技术恰好解决了这一难题。目前,搜索引擎系统可以分类三大类,分别是:目录式搜索引擎:以人工方式或半…...

代码随想录刷题-字符串-实现 strStr()
文章目录实现 strStr()习题暴力解法kmp 解法实现 strStr() 本节对应代码随想录中:代码随想录,讲解视频:帮你把KMP算法学个通透!(理论篇)_哔哩哔哩_bilibili、帮你把KMP算法学个通透!࿰…...

前端已死?金三银四?你收到offer了吗?
目录 一、前言 二、“唱衰” 三、不局限于框架、前端 四、打动面试官 五、正向加成 六、小结 一、前言 最近在脉脉、知乎等平台都有人在渲染前端从业人员的危机,甚至使用“前端已死”的字眼,颇有“语不惊人死不休”的意味,对老鸟来说&a…...

C生万物 | 十分钟带你学会位段相关知识
结构体相关知识可以先看看这篇文章 —— 链接 一、什么是位段 位段的声明和结构是类似的,有两个不同: 位段的成员必须是 int、unsigned int 或signed int位段的成员名后边有一个冒号和一个数字 在下面,我分别写了一个结构体和一个位段&…...

Spring Boot基础学习之(十):修改员工的信息
注意:spring boot专栏是一个新手项目,博文顺序则是功能实现的流程,如果有看不懂的内容可以到前面系列去了解。 本次项目所有能够使用的静态资源可以免费进行下载 静态资源 在本篇代码DAO层将通过Java文件去实现,在这里就不连接数…...

闭关十几天,我完成了我的毕业设计
个人简介 👀个人主页: 前端杂货铺 🙋♂️学习方向: 主攻前端方向,也会涉及到服务端(Node.js) 📃个人状态: 在校大学生一枚,已拿多个前端 offer(…...

认识rust的项目管理工具--cargo
cargo 提供了一系列的工具,从项目的建立、构建到测试、运行直至部署,为 Rust 项目的管理提供尽可能完整的手段。不过,我们无需再手动安装,之前安装 Rust 的时候(用rustup或者vscode加插件的方式安装)&#…...

面试常问的Linux之 I/O 复用
I/O 复用 一、I/O的概念 在Linux系统中,I/O(输入/输出)指的是计算机系统的数据交换过程,包括从外部设备读取数据(输入)和将数据发送到外部设备(输出)。I/O操作是Linux系统中非常重要…...

MySQL-binlog+dump备份还原
目录 🍁binlog日志恢复 🍂binlog介绍 🍂Binlog的用途 🍂开启binary log功能 🍂配置binlog 🍁mysqldump 🍂数据库的导出 🍂数据库的导入 🍁mysqldumpbinlog 🦐…...

互联网络-单级互联网络
1.立方体单级网络 1.定义 立方体单级网络(cube)的名称来源于下图所示的三维立方体结构,如010只能连接到000、011、110,不能直接连接到对角线上的001、100、101、111。 2.例题 1.编号为0、1、2、3、4,…,15的16个处理器,用单级互联网络互联,用Cube0互联函数时,与第10…...

上海亚商投顾:沪指四连阳重回3300点 中字头个股再发力
上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 市场情绪大小指数今日走势分化,沪指低开后震荡反弹,创业板指盘中跌超1%。中字头个股再度发力&#x…...

LeetCode:150. 逆波兰表达式求值—栈
🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀算法专栏: 👉🏻123 一、🌱150. 逆波兰表达式求值 题目描述:给你一个字符串数组 token…...

C/C++每日一练(20230410) 二叉树专场(4)
目录 1. 二叉搜索树迭代器 🌟🌟🌟 2. 验证二叉搜索树 🌟🌟🌟 3. 不同的二叉搜索树 II 🌟🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专…...

策化整理1
概述: 本游戏是一款恐怖类解密游戏,以反应毒品的危害和反对家庭暴力为主题 在游戏中玩家扮演被困入梦境内的主人公,寻找逃出梦境的方法 本游戏故事大背景: 主人公的父亲是一名毒贩,在母亲发现父亲开始吸毒后选择与父亲…...

【服务通信自定义srv调用3----客户端的优化】
客户端的优化 服务通信自定义srv调用,客户端随意提交两个数,完成数的相加。也就是实现参数的动态提交: 1.格式:rosrun xxxx xxxx 12 34 2.节点执行时候,需要获取命令中的参数,并且组织进 request 代码中应…...

React跨域解决方案
一、跨域日志报错 我们由于项目需要经常会需要对不同域名、不同子域的网站接口发起请求,有时甚至是对于同一域名的不同端口发起请求,此时我们经常看到以下报错: Access to XMLHttpRequest at xxx from origin xxx has been blocked by COR…...

内存五区的概念,内存池技术的诞生。
首先提出一道经典的面试题来引出今天的主角: 进程的虚拟空间分布是什么样的,全局变量放在哪里? 在数据初始化之后,全局变量放在.data段 在数据未初始化时,全局变量放在.bss段 内存五区 进程虚拟内存主要分为五个部分…...

力扣:字符串中的第一个唯一字符(C++实现)
题目部分: 解题思路: 方案一: 首先认真审题的小伙伴们一定会发现就是题目给了提示只包含小写字母,也就是说我们的排查范围是小写的26个字母。为了怕有的友友们一时短路想不起来,我就其按照顺序列出来吧。 即&#x…...

攻防世界 favorite_number mfw、[BJDCTF2020]ZJCTF,不过如此
favorite_number 进入环境得到源码 <?php //php5.5.9 $stuff $_POST["stuff"]; $array [admin, user]; if($stuff $array && $stuff[0] ! admin) {$num $_POST["num"];if (preg_match("/^\d$/im",$num)){if (!preg_match("…...

SummingMergeTree
假设有这样⼀种查询需求:终端⽤户只需要查询数据的汇总结果,不关⼼明细数据,并且数据的汇总条件是预先明确的(GROUP BY 条件明确,且不会随意改变)。 对于这样的查询场景,在ClickHouse中如何解决…...

JUC并发编程基础篇第一章之进程/并发/异步的概念[理解基本概念]
1. 进程和线程的概念 进程: 系统正在运行的一个应用程序;程序一旦运行就是一个进程;进程是资源分配的最小单位 线程: 是进程的实际运行单位;一个人进程可以并发控制多个线程,每条线程并行执行不同的任务 区别: 进程基本上相互独立的;而线程存在于进程内,是进程…...

c语言—指针进阶
创作不易,本篇文章如果帮助到了你,还请点赞支持一下♡>𖥦<)!! 主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…...

总结二分法
杨辉三角形(快速查找唯一值,mid型) //二分法解//流程:最大列->起点行->2k--n之间究竟哪一行(二分排列组合)->找到行数就等差数列对应位置#include<stdio.h> #include<stdlib.h>//注意排列组合的规律是建立在…...

二叉搜索树和AVL树
目录 一、二叉搜索树 1.什么是二叉搜索树 2.二叉搜索树的实现 (1)构建类 (2)查找函数 (3)插入函数 (4)删除函数 (5)补齐默认成员函数 (6…...

计算机体系结构量化研究方法【2】高速缓存Cache
目录1.计算机存储层次结构2.缓存相关概念3.缓存组织方式4.Cache回写机制5.Cache性能量化1.计算机存储层次结构 计算机存储层次结构可以看作是一个金字塔,越靠上层,容量越小,速度越快 L0:寄存器----CPU的寄存器保存着Cache取出的…...

初识设计模式 - 迭代器模式
简介 迭代器设计模式(Iterator Design Pattern),也叫作游标设计模式(Cursor Design Pattern)。 迭代器模式将集合对象的遍历操作从集合类中拆分出来,放到迭代器类中,让两者的职责更加单一。 …...

三路快排(基于三指针单趟排序的快速排序)+快排时间复杂度再分析
目录 一.前言 二. 三路快排 😍算法思想: 😍算法实现步骤: 😍三指针单趟排序的实现: 😍非递归快排完全体: 🤔与C标准库里的快排进行对比测试: 三.快排时间复杂度再分析 一.前言 http://t.csdn.cn/mz8dghttp://…...

Eyeshot Ultimate 2023 Crack
Eyeshot Ultimate 2023 Crack 已经引入了文档类。 工作区。文档现在包含绘制场景内容所需的所有数据。 2022版GEntities已被删除。 最后,一个真正的跨平台中立核心产品是可用的。 新功能 曲线、平面、曲面和体积网格。 屏幕空间环境光遮挡。 托管ReadDWG和ReadDXF类…...

JAVA-8-[SpringBoot]入门程序案例和原理分析
Spring Boot框架入门教程(快速学习版) Spring Boot教程BooTWiki.COM 1 Spring Boot Spring Boot是Pivotal(关键性的)团队在Spring的基础上提供的一套全新的开源框架,其目的是为了简化Spring应用的搭建和开发过程。Spring Boot去除了大量的X…...

前端工程化
一、AST (抽象语法树,Abstract Syntax Tree) 手把手带你走进Babel的编译世界 - 掘金 (juejin.cn) 1、概念 我们所写的代码转换为机器能识别的一种树形结构,本身是由一堆节点(Node)组成,每个节…...