| 不知你上网时注意到没有:一些内容丰富的网站,总建有一个内容搜索引擎,你只要输入你想阅读资料的类别(比如:windows98),一按“搜索”按钮,该网站所有关于“windows98”的文章列表就呈现在你的眼前,好不方便啊!要知道当自己想要查的资料老是找不到,整天按着“下一页”这个按钮把页面翻来翻去的,这真是一件烦心的事情。那么在网上建有家的朋友是不是也想在你的网站按一个这样的搜索引擎呢?在下面我介绍如何用ASP打造一个站内搜索引擎。当然了,我的这个搜索引擎是不能与那些门户网站的搜索引擎相比的。 |
|
注:由于搜索引擎的资料都是放在数据库内,所以要求大家对数据库该有一定的了解。在这里我选择MicroSoft的Access 2000当作存放资料的数据库,对个人网站的要求来讲已经绰绰有余了。数据库的表格名称和字段定义如下所示,我将数据库取名为Search.mdb。 |
|
表格名称
|
搜索引擎
|
|
字段名称
|
字段属性
|
|
文章编号
|
自动编号
|
|
文章标题
|
文字(255字符)
|
|
文章网址
|
文字(255字符)
|
|
内容简述
|
文字(255字符)
|
|
加入时间
|
日期/时间
|
|
访问次数
|
数字
|
|
|
最后一项"访问次数"可加可不加,如果你的网站有针对文章访问率作统计的话,那最好将他加上,可以让读者做个参考,其它几个字段应该都是不可或缺的(对内容网站而言)。数据库建好之后接下来就是要将资料输入了,由于本文主要是针对ASP的应用,所以对于数据库这部分我就不详解了,这一部份交给大家去完成,现在最重要的就是让我看看运行搜索功能的程序该如何编写的。 |
|
首先你需要一个输入搜索字符串的接口,这部分只需要一个简单的Html档就可以完成。我把它命名为Search.htm。 |
|
<%注:输入的字符串将传送到Search.asp%> |
|
<FORM METHOD=POST ACTION="Search.asp"> |
|
<font color=ffffff>文章搜索: </font> |
|
<INPUT TYPE=TEXT NAME="strSearchString" SIZE="30"> |
|
<INPUT TYPE=SUBMIT value="搜索"></FORM></BODY></HTML> |
|
接着就应进入本文的主题了。在这里我把这个程序命名为Search.asp。搜索引擎的运作过程如下所示:将字符串传递给Search.asp,将目前所在页数、搜索字符串、资料篇数传递至Search.asp,如果字符串是由按钮传来的。 |
|
注:将目前所在页数、搜索字符串、资料篇数传递至Search.asp: |
|
<!--#include file="adovbs.inc"--> |
|
<body background=/images/bg.gif> |
|
<%注:ACTION是判断使用者在搜索结果之后是按下上一页的按钮还是下一页的按钮%> |
|
<% ACTION = Request.Form("ACTION") %> |
|
<% PAGE = CInt(Request.Form("PAGE")) %> |
|
<%注:由RCOUNT来判断目前显示的资料是哪几篇%> |
|
<% RCOUNT = CInt(Request.Form("RCOUNT")) %> |
|
<% If RCOUNT = "" Then %> |
|
<% If RCOUNT = "0" Then %> |
|
<%注:从strSearchString表单中取出字符串%> |
|
<%strSearchString=Request.Form("strSearchString")%> |
|
MyConnectString = "DRIVER={Microsoft Access Driver |
|
(*.mdb)};DBQ=" & Server.MapPath("/asp/search/Search.mdb") |
|
& ";DefaultDir=" & Server.MapPath("/asp/search") & |
|
Access;MaxBufferSize=512;PageTimeout=5" |
|
Set Conn = Server.CreateObject("ADODB.Connection") |
|
Conn.Open MyConnectString |
|
strSearch1 = "<font size=3 color='ffffff' |
|
style='background:ff8000'>" & strSearchString & "</font>" |
|
strSQL = "SELECT * FROM 搜索引擎 WHERE " |
|
注:为了避免读者不小心在字符串中输入空格符而找不到数据,所以我在这时用了一点字符串处理的小技巧,定义空格符初始位置为1,找出输入字符串中空格符的位置。 |
|
Pos = InStr(1,strSearchString," ") |
|
注:如果输入字符串中不包含空白字符串就不需要作字符串处理,直接进数据库比对资料: |
|
tmpSQL = tmpSQL & "'%" & strSearchString & "%' OR 文章标题 |
|
LIKE '%" & strSearchString & "%')" |
|
注:将输入字符串以空白区隔开,当作个别搜索字符串,譬如搜索"电脑 超频",会变成搜索"电脑"、"超频",以"电脑 超频"而言,当运行mid(strSearchString, 1, pos-1)时,所得到的结果是显示从输入字符串的第一个字符到空格符所出现的位置(3)然后减1得到电脑两个字'而这时候搜索字符串已经变成"电脑"接下来先算出搜索字符串的长度len(strSearchString)=(5),再算出空格符加一后的位置然后运行: |
|
Mid(strSearchString,Pos+1,len(strSearchString)), |
|
这时就可以取出"电脑 超频"中的超频两个字,此时搜索字符串已经被分离成电脑和超频两个字了,如果你不用上面这段字符串处理程序,你会发现只要你的搜索字符串中含有空格符就会找不到数据; |
|
tmpSQL = tmpSQL & "'%" & mid(strSearchString, 1, pos-1) & "%' |
|
OR 文章标题 LIKE '%" & mid(strSearchString, 1, pos-1) & "%' |
|
Mid(strSearchString,Pos+1,len(strSearchString)) |
|
注:将SQL语法分离的优点是弹性大,你不需要重复定义就可以无限次套用。 |
|
strSQL = strSQL & " ORDER BY 文章编号" |
|
经过字符串处理程序之后,此时完整的SQL语法将呈现如下的内容:'SELECT * FROM 搜索引擎 WHERE 内容简述 LIKE 电脑 OR 文章标题 LIKE 电脑 AND 内容简述 LIKE 超频 OR 文章标题 LIKE 超频 ORDER BY 文章编号。 |
|
Set rsResults = Server.CreateObject("ADODB.Recordset") |
|
rsResults.Open strSQL, conn,3 |
|
注:计算搜索到的资料总篇数,这时候的tmpSQL=(内容简述 LIKE 电脑 OR 文章标题 LIKE 电脑 AND 内容简述 LIKE 超频 OR 文章标题 LIKE 超频) |
|
strSQL = "SELECT COUNT(*) FROM 搜索引擎 WHERE " & tmpSQL |
|
Set rsTotalRecords = Conn.Execute(strSQL) |
|
<%注:定义每一页显示的资料篇数是10篇HOWMANY = 10rsResults.PageSize = HOWMANY%> |
|
<% If ACTION = "FORWARD" Then %> |
|
<% RCOUNT = RCOUNT + HOWMANY %> |
|
<%注:如果你是从第一页跳到第二页,你应该先将第1到第10篇资料略过,只显示第11篇到第20篇资料,因为原本在第一页的时候Rcount为0,加上10之后就等于10,而这10篇资料就是你所要略过的,同样的,如果你是从第二页跳往第三页的话,你必须略过第1篇到第20篇的资料,从第21篇资料开始显示rsResults.MoveNext'就是在运行这个略过的动作%> |
|
<% For DACOUNT = 1 To RCOUNT %> |
|
<% If ACTION = "BACK" Then %> |
|
<% RCOUNT = RCOUNT - HOWMANY %> |
|
<%注:如果不是在第一页的话(RCOUNT <> 0)才要运行资料略过的动作%> |
|
<% If RCOUNT <> 0 Then %> |
|
<% For DACOUNT = 1 To RCOUNT %> |
|
<%注:如果数据库中没有符合的资料就告知读者找不到资料%> |
|
<% if rsResults.EOF then %> |
|
<A HREF="Search.htm">回到搜索首页</A> |
|
<center>找到<%=rsTotalRecords(0)%>篇记录 <BR><p> |
|
iCurrentID = rsResults("文章编号") |
|
注:将文章标题含有搜索字符串的字加上特殊效果,并将转换后的结果传给Message变量,Replace函数的用法如下:例如你有一个字符串变量 |
|
如果你想将电脑这个字转变成Computer,你可以使用如下的方法: |
|
AAA=Replace(AAA, “专业电脑网站”, “Computer”) |
|
***结果AAA就变成专业Computer网站了*** |
|
Message = CStr(Replace(rsResults("文章标题 |
|
"),strSearchString,strSearch1)) %> |
|
注:将内容简述含有搜索字符串的字加上特殊效果,并将转换后的结果传给Message1变量; |
|
Message1 = CStr(Replace(rsResults("内容简述"),strSearchString,strSearch1)) %> |
|
<table border="0" width="500"> |
|
<td width="500"><A HREF="<%=rsResults("网址")%>"><LI> <% =iCurrentID%>、<%=Message%></A></td> |
|
<td width="500"><%=Message1%><%=rsResults("加入时间")%></td> |
|
<td width="500">访问次数:<font color=red><%=rsResults("访问次数")%></font></td> |
|
<%注:在这里我将搜索动作设定为:当找到10篇资料之后就停止搜索,我用到一个变量Y来控制,先定义Y等于0,每找到一篇资料就将Y加一,当Y等于10的时候先看看数据库是不是还有资料,如果还有资料就将剩下的资料通通略过,就是rsResults.MoveNext。%> |
|
<div align="center"><center> |
|
<table border="0" width="400"> |
|
<%注:以RCOUNT来判断是不是在第一页,如果不是在第一页就显示上一页的按钮,并将预设的参数(数据篇数-RCOUNT、目前页数-PAGE、搜索字符串-strSearchString)传回%> |
|
<form method="POST" action="search.asp"> |
|
<input type="hidden" name="ACTION" value="BACK"> |
|
<INPUT TYPE=HIDDEN NAME="strSearchString" |
|
VALUE="<%=strSearchString%>"> |
|
<input type="hidden" name="RCOUNT" value="<% =RCOUNT %>"> |
|
<input type="hidden" name="PAGE" value="<% =PAGE %>"> |
|
<p><font face="Arial"><input type="submit" value="上一页 |
|
"><%=strSearchString%></font></p> |
|
<%注:如果不是在最后一页(rsResults.PageCount代表总页数)就显示下一页的按钮,并将预设的参数(数据篇数-RCOUNT、目前页数-PAGE、搜索字符串-strSearchString)传回%> |
|
<% If PAGE = rsResults.PageCount Then %> |
|
<form method="POST" action="search.asp"> |
|
<INPUT TYPE=HIDDEN NAME="strSearchString" |
|
VALUE="<%=strSearchString%>"> |
|
<input type="hidden" name="ACTION" value="FORWARD"> |
|
<input type="hidden" name="RCOUNT" value="<% =RCOUNT %>"> |
|
<input type="hidden" name="PAGE" value="<% =PAGE %>"> |
|
<p><font face="Arial"><input type="submit" value="下一页 |
|
"><%=rsResults.PageCount%></font></p> |
|
完成以上步骤,一个简单的站内搜索引擎就完成了,在网上显示的介面如下图: |
|
由于这个搜索引擎主要是针对个人网站的资料作搜索,所以在设计上并不太难,与一般门户网站的搜索引擎相比,其最大的差别就在于门户网站的数据库是以关联性和层次性的资料型态存在,而我所介绍的这个搜索引擎仅仅只包含一个层次而已,不过对那些单纯的内容个人网站来说却已是绰绰有余了。 |
| |
|