不知你上網(wǎng)時(shí)注意到?jīng)]有:一些內(nèi)容豐富的網(wǎng)站,總建有一個(gè)內(nèi)容搜索引擎,你只要輸入你想閱讀資料的類別(比如:windows98),一按“搜索”按鈕,該網(wǎng)站所有關(guān)于“windows98”的文章列表就呈現(xiàn)在你的眼前,好不方便啊!要知道當(dāng)自己想要查的資料老是找不到,整天按著“下一頁”這個(gè)按鈕把頁面翻來翻去的,這真是一件煩心的事情。那么在網(wǎng)上建有家的朋友是不是也想在你的網(wǎng)站按一個(gè)這樣的搜索引擎呢?在下面我介紹如何用ASP打造一個(gè)站內(nèi)搜索引擎。當(dāng)然了,我的這個(gè)搜索引擎是不能與那些門戶網(wǎng)站的搜索引擎相比的。 注:由于搜索引擎的資料都是放在數(shù)據(jù)庫內(nèi),所以要求大家對數(shù)據(jù)庫該有一定的了解。在這里我選擇MicroSoft的Access 2000當(dāng)作存放資料的數(shù)據(jù)庫,對個(gè)人網(wǎng)站的要求來講已經(jīng)綽綽有余了。數(shù)據(jù)庫的表格名稱和字段定義如下所示,我將數(shù)據(jù)庫取名為Search.mdb。 表格名稱 搜索引擎 字段名稱 字段屬性 文章編號(hào) 自動(dòng)編號(hào) 文章標(biāo)題 文字(255字符) 文章網(wǎng)址 文字(255字符) 內(nèi)容簡述 文字(255字符) 加入時(shí)間 日期/時(shí)間 訪問次數(shù) 數(shù)字 最后一項(xiàng)"訪問次數(shù)"可加可不加,如果你的網(wǎng)站有針對文章訪問率作統(tǒng)計(jì)的話,那最好將他加上,可以讓讀者做個(gè)參考,其它幾個(gè)字段應(yīng)該都是不可或缺的(對內(nèi)容網(wǎng)站而言)。數(shù)據(jù)庫建好之后接下來就是要將資料輸入了,由于本文主要是針對ASP的應(yīng)用,所以對于數(shù)據(jù)庫這部分我就不詳解了,這一部份交給大家去完成,現(xiàn)在最重要的就是讓我看看運(yùn)行搜索功能的程序該如何編寫的。 首先你需要一個(gè)輸入搜索字符串的接口,這部分只需要一個(gè)簡單的Html檔就可以完成。我把它命名為Search.htm。 Search.htm <%注:輸入的字符串將傳送到Search.asp%>接著就應(yīng)進(jìn)入本文的主題了。在這里我把這個(gè)程序命名為Search.asp。搜索引擎的運(yùn)作過程如下所示:將字符串傳遞給Search.asp,將目前所在頁數(shù)、搜索字符串、資料篇數(shù)傳遞至Search.asp,如果字符串是由按鈕傳來的。 YES NO NO YES NO 注:將目前所在頁數(shù)、搜索字符串、資料篇數(shù)傳遞至Search.asp: Search.asp <!--#include file="adovbs.inc"--> <%注:ACTION是判斷使用者在搜索結(jié)果之后是按下上一頁的按鈕還是下一頁的按鈕%> <% ACTION = Request.Form("ACTION") %> <%注:由PAGE判斷目前所在頁數(shù)%> <% PAGE = CInt(Request.Form("PAGE")) %> <%注:由RCOUNT來判斷目前顯示的資料是哪幾篇%> <% RCOUNT = CInt(Request.Form("RCOUNT")) %> <%注:如果是在第一頁就將PAGE設(shè)為1%> <% If RCOUNT = "" Then %> <% RCOUNT = "0" %> <% End If %> <% If RCOUNT = "0" Then %> <% PAGE = 1 %> <% End If %> <%注:從strSearchString表單中取出字符串%> <%strSearchString=Request.Form("strSearchString")%> <% 注:定義數(shù)據(jù)庫的路徑: Dim MyConnectString MyConnectString = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & Server.MapPath("/asp/search/Search.mdb") & ";DefaultDir=" & Server.MapPath("/asp/search") & ";DriverId=25;FILE=MS Access;MaxBufferSize=512;PageTimeout=5" 注:打開數(shù)據(jù)庫連結(jié): Dim Conn Set Conn = Server.CreateObject("ADODB.Connection") 注:由數(shù)據(jù)庫連結(jié)來打開數(shù)據(jù)庫 Conn.Open MyConnectString 注:將搜索到的字符串作特殊處理: strSearch1 = "" & strSearchString & "" 注:開始定義數(shù)據(jù)庫搜索語法 Dim strSQL, tmpSQL strSQL = "SELECT * FROM 搜索引擎 WHERE " tmpSQL = "內(nèi)容簡述 LIKE " 注:為了避免讀者不小心在字符串中輸入空格符而找不到數(shù)據(jù),所以我在這時(shí)用了一點(diǎn)字符串處理的小技巧,定義空格符初始位置為1,找出輸入字符串中空格符的位置。 Dim Pos Pos = 1 While Pos > 0 Pos = InStr(1,strSearchString," ") 注:如果輸入字符串中不包含空白字符串就不需要作字符串處理,直接進(jìn)數(shù)據(jù)庫比對資料: If Pos = 0 Then tmpSQL = tmpSQL & "‘%" & strSearchString & "%‘ OR 文章標(biāo)題 LIKE ‘%" & strSearchString & "%‘)" 注:如果輸入字符串中包含空白字符串: Else 注:將輸入字符串以空白區(qū)隔開,當(dāng)作個(gè)別搜索字符串,譬如搜索"電腦 超頻",會(huì)變成搜索"電腦"、"超頻",以"電腦 超頻"而言,當(dāng)運(yùn)行mid(strSearchString, 1, pos-1)時(shí),所得到的結(jié)果是顯示從輸入字符串的第一個(gè)字符到空格符所出現(xiàn)的位置(3)然后減1得到電腦兩個(gè)字‘而這時(shí)候搜索字符串已經(jīng)變成"電腦"接下來先算出搜索字符串的長度len(strSearchString)=(5),再算出空格符加一后的位置然后運(yùn)行: Mid(strSearchString,Pos+1,len(strSearchString)), 這時(shí)就可以取出"電腦 超頻"中的超頻兩個(gè)字,此時(shí)搜索字符串已經(jīng)被分離成電腦和超頻兩個(gè)字了,如果你不用上面這段字符串處理程序,你會(huì)發(fā)現(xiàn)只要你的搜索字符串中含有空格符就會(huì)找不到數(shù)據(jù); tmpSQL = tmpSQL & "‘%" & mid(strSearchString, 1, pos-1) & "%‘ OR 文章標(biāo)題 LIKE ‘%" & mid(strSearchString, 1, pos-1) & "%‘ AND 內(nèi)容簡述 LIKE " strSearchString = Mid(strSearchString,Pos+1,len(strSearchString)) End If Wend 注:將SQL語法分離的優(yōu)點(diǎn)是彈性大,你不需要重復(fù)定義就可以無限次套用。 strSQL = strSQL & tmpSQL strSQL = strSQL & " ORDER BY 文章編號(hào)" 經(jīng)過字符串處理程序之后,此時(shí)完整的SQL語法將呈現(xiàn)如下的內(nèi)容:‘SELECT * FROM 搜索引擎 WHERE 內(nèi)容簡述 LIKE 電腦 OR 文章標(biāo)題 LIKE 電腦 AND 內(nèi)容簡述 LIKE 超頻 OR 文章標(biāo)題 LIKE 超頻 ORDER BY 文章編號(hào)。 注:下面建立數(shù)據(jù)庫集合: Dim rsResults Set rsResults = Server.CreateObject("ADODB.Recordset") rsResults.Open strSQL, conn,3 注:計(jì)算搜索到的資料總篇數(shù),這時(shí)候的tmpSQL=(內(nèi)容簡述 LIKE 電腦 OR 文章標(biāo)題 LIKE 電腦 AND 內(nèi)容簡述 LIKE 超頻 OR 文章標(biāo)題 LIKE 超頻) Dim rsTotalRecords strSQL = "SELECT COUNT(*) FROM 搜索引擎 WHERE " & tmpSQL Set rsTotalRecords = Conn.Execute(strSQL) %> <%注:定義每一頁顯示的資料篇數(shù)是10篇HOWMANY = 10rsResults.PageSize = HOWMANY%> <%注:如果是按下下一頁的按鈕的話%> <% If ACTION = "FORWARD" Then %> <%注:先將目前所在頁數(shù)加一%> <% PAGE = PAGE + 1 %> <%注:再將目前顯示的資料篇數(shù)加10%> <% RCOUNT = RCOUNT + HOWMANY %> <%注:如果你是從第一頁跳到第二頁,你應(yīng)該先將第1到第10篇資料略過,只顯示第11篇到第20篇資料,因?yàn)樵驹诘谝豁摰臅r(shí)候Rcount為0,加上10之后就等于10,而這10篇資料就是你所要略過的,同樣的,如果你是從第二頁跳往第三頁的話,你必須略過第1篇到第20篇的資料,從第21篇資料開始顯示rsResults.MoveNext‘就是在運(yùn)行這個(gè)略過的動(dòng)作%> <% For DACOUNT = 1 To RCOUNT %> <% rsResults.MoveNext %> <% Next %> <% End If %> <%注:相反的如果是按下上一頁按鈕的話%> <% If ACTION = "BACK" Then %> <%注:先將目前所在頁數(shù)減一%> <% PAGE = PAGE - 1 %> <5注:再將目前顯示的資料篇數(shù)減10%> <% RCOUNT = RCOUNT - HOWMANY %> <%注:如果不是在第一頁的話(RCOUNT <> 0)才要運(yùn)行資料略過的動(dòng)作%> <% If RCOUNT <> 0 Then %> <% For DACOUNT = 1 To RCOUNT %> <% rsResults.MoveNext %> <% Next %> <% End If %> <% End If %> <%注:如果數(shù)據(jù)庫中沒有符合的資料就告知讀者找不到資料%> <% if rsResults.EOF then %> 對不起,找不到你想要的資料.
回到搜索首頁 <%注:如果有找到資料就準(zhǔn)備顯示資料%> <% Else%>
找到<%=rsTotalRecords(0)%>篇記錄
<% Dim Y Y=0 While Not rsResults.EOF iCurrentID = rsResults("文章編號(hào)") %> <% 注:將文章標(biāo)題含有搜索字符串的字加上特殊效果,并將轉(zhuǎn)換后的結(jié)果傳給Message變量,Replace函數(shù)的用法如下:例如你有一個(gè)字符串變量 AAA=”專業(yè)電腦網(wǎng)站” 如果你想將電腦這個(gè)字轉(zhuǎn)變成Computer,你可以使用如下的方法: AAA=Replace(AAA, “專業(yè)電腦網(wǎng)站”, “Computer”) ***結(jié)果AAA就變成專業(yè)Computer網(wǎng)站了*** Message = CStr(Replace(rsResults("文章標(biāo)題 "),strSearchString,strSearch1)) %> <% 注:將內(nèi)容簡述含有搜索字符串的字加上特殊效果,并將轉(zhuǎn)換后的結(jié)果傳給Message1變量; Message1 = CStr(Replace(rsResults("內(nèi)容簡述"),strSearchString,strSearch1)) %>
<%注:將搜索結(jié)果顯示出來%>
<% =iCurrentID%>、<%=Message%><%=Message1%><%=rsResults("加入時(shí)間")%>
訪問次數(shù):<%=rsResults("訪問次數(shù)")%>
<%注:在這里我將搜索動(dòng)作設(shè)定為:當(dāng)找到10篇資料之后就停止搜索,我用到一個(gè)變量Y來控制,先定義Y等于0,每找到一篇資料就將Y加一,當(dāng)Y等于10的時(shí)候先看看數(shù)據(jù)庫是不是還有資料,如果還有資料就將剩下的資料通通略過,就是rsResults.MoveNext。%> <% Y = Y + 1 rsResults.MoveNext If Y=10 then While Not rsResults.EOF rsResults.MoveNext Wend End If Wend %> <%注:準(zhǔn)備顯示上一頁和下一頁的按鈕%>
<%注:以RCOUNT來判斷是不是在第一頁,如果不是在第一頁就顯示上一頁的按鈕,并將預(yù)設(shè)的參數(shù)(數(shù)據(jù)篇數(shù)-RCOUNT、目前頁數(shù)-PAGE、搜索字符串-strSearchString)傳回%> <% If RCOUNT > 0 Then %>
<%=strSearchString%>
<% End If %><%注:如果不是在最后一頁(rsResults.PageCount代表總頁數(shù))就顯示下一頁的按鈕,并將預(yù)設(shè)的參數(shù)(數(shù)據(jù)篇數(shù)-RCOUNT、目前頁數(shù)-PAGE、搜索字符串-strSearchString)傳回%> <% If PAGE = rsResults.PageCount Then %> <% Else %>
<%=rsResults.PageCount%>
<% End If %>
<%End IF%> 完成以上步驟,一個(gè)簡單的站內(nèi)搜索引擎就完成了,在網(wǎng)上顯示的介面如下圖:
此主題相關(guān)圖片如下:
小結(jié): 由于這個(gè)搜索引擎主要是針對個(gè)人網(wǎng)站的資料作搜索,所以在設(shè)計(jì)上并不太難,與一般門戶網(wǎng)站的搜索引擎相比,其最大的差別就在于門戶網(wǎng)站的數(shù)據(jù)庫是以關(guān)聯(lián)性和層次性的資料型態(tài)存在,而我所介紹的這個(gè)搜索引擎僅僅只包含一個(gè)層次而已,不過對那些單純的內(nèi)容個(gè)人網(wǎng)站來說卻已是綽綽有余了。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報(bào)。