[摘要]網(wǎng)站實(shí)現(xiàn)站內(nèi)檢索已經(jīng)成為一個(gè)站點(diǎn)的基本要求,也是站點(diǎn)維護(hù)者必須解決的問(wèn)題,本文以ASP技術(shù)為例,說(shuō)明了如何利用遞歸算法實(shí)現(xiàn)在站內(nèi)的自動(dòng)檢索。
[關(guān)鍵詞]動(dòng)態(tài)網(wǎng)站 站內(nèi)搜索 遞歸 文件檢索
自從有了計(jì)算機(jī)以后,人類(lèi)開(kāi)始用計(jì)算機(jī)保存信息,有保存,就有查找,于是檢索技術(shù)誕生了。隨著計(jì)算機(jī)網(wǎng)絡(luò)的迅猛發(fā)展,文本檢索技術(shù)的發(fā)展發(fā)展可謂日新月異、與時(shí)俱進(jìn),人們開(kāi)始習(xí)慣互聯(lián)網(wǎng)的檢索時(shí)代,站內(nèi)檢索的需求也已經(jīng)顯露出來(lái)。
一、為什么有了搜索引擎還需要站內(nèi)檢索
用網(wǎng)際搜索引擎不是直接可以查找嗎?這其中有兩個(gè)問(wèn)題:1.搜索足球,你會(huì)搜索到48,300,000個(gè)網(wǎng)頁(yè),也不知道我公司的排在第10,000頁(yè)還是10,001頁(yè),搜索者可能永遠(yuǎn)也不會(huì)去看。2.網(wǎng)際搜索引擎通過(guò)網(wǎng)絡(luò)Spider收集網(wǎng)頁(yè),對(duì)于網(wǎng)站內(nèi)隱藏很深的網(wǎng)頁(yè)是很難檢索到的。
二、本文實(shí)現(xiàn)的功能
1.目前互聯(lián)網(wǎng)采用較多的一種技術(shù)是利用數(shù)據(jù)庫(kù)實(shí)現(xiàn)站內(nèi)搜索。該方法固然有其優(yōu)勢(shì),但一個(gè)不容忽視的方面是該方法需要較多的后期維護(hù),而且不支持文本型文件的檢索,對(duì)于關(guān)鍵字的整理也很難取舍。
2.本文提供的程序可以將其放在站點(diǎn)的任何目錄下,它將對(duì)該站點(diǎn)下的所有文本型文件進(jìn)行檢索,支持下級(jí)無(wú)限目錄。
三、該系統(tǒng)采用的相關(guān)技術(shù)和功能實(shí)現(xiàn)
1.REQUEST和RESPONSE對(duì)象在ASP中的應(yīng)用。
2.ASP環(huán)境變量在應(yīng)用程序中的作用。
3.服務(wù)器端文件和文件夾的操作技術(shù)的具體應(yīng)用。
4.VBScript的字符串操作函數(shù)在程序設(shè)計(jì)中的靈活性。
5.遞歸算法在程序設(shè)計(jì)中的強(qiáng)大功能。
6.我們只查找文本類(lèi)型的文件,即能用記事本打開(kāi)查看內(nèi)容的文件類(lèi)型,包括.htm、.html、.js、.css、.txt、.asp、.xml等文件。
7.把查找到的結(jié)果顯示出來(lái),包括關(guān)鍵字附近的內(nèi)容及具體的文件路徑。
8.若被檢索文件中含有多處關(guān)鍵字,只顯示第一處。
9.為安全及顯示效果問(wèn)題,我們?nèi)サ粑募?biāo)簽后顯示;如果標(biāo)簽內(nèi)部含有關(guān)鍵字,可以檢索出來(lái),但無(wú)法顯示其具體內(nèi)容。
10.程序代碼在IIS5.1下調(diào)試通過(guò)。
四、關(guān)鍵代碼及說(shuō)明
<%
If Request(“Caps”) = “on” Then bolCaps = 0 Else bolCaps = 1 //0區(qū)分大小寫(xiě),1不區(qū)分
Set objFSO = Server.CreateObject(“Scripting.FileSystemObject”)
strRoot=left(request.servervariables(“path_info”),InStrRev(request.servervariables(“path_info”),“/”)-1) //取得該文件的虛擬路徑
RealPath=Server.MapPath(strroot)//取得完整的實(shí)際路徑
VirtualPath=“http://” Request.ServerVariables(“SERVER_NAME”) strRoot
//取得完整的URL
Set objFolder = objFSO.GetFolder(RealPath)
schSubFolder(objFolder)
Sub schSubFol(objFolder)//遞歸函數(shù)
For Each objFile in objFolder.Files
If Response.IsClientConnected Then // 取要檢索文件的擴(kuò)展名
If Mid(objFile.Name, Len(objFile.Name) - 1, 1) = “.” Then
strExt = Mid(objFile.Name, Len(objFile.Name) - 1, 2)
ElseIf Mid(objFile.Name, Len(objFile.Name) - 2, 1) = “.” Then
strExt = Mid(objFile.Name, Len(objFile.Name) - 2, 3)
ElseIf Mid(objFile.Name, Len(objFile.Name) - 3, 1) = “.” Then
strExt = Mid(objFile.Name, Len(objFile.Name) - 3, 4)
ElseIf Mid(objFile.Name, Len(objFile.Name) - 4, 1) = “.” Then
strExt = Mid(objFile.Name, Len(objFile.Name) - 4, 5)
End If
If Instr(1, strFile, strExt, 1) Then // 如果該文件擴(kuò)展名符合要檢索的擴(kuò)展名strFile
Set objTextStream = objFSO.OpenTextFile(objFile.Path,1)
strContent = objTextStream.ReadAll
objTextStream.Close
if InStr(1, strContent, strText, bolCaps) then //如果存在要搜索的字串strText
If InStr(1, strContent, “
strTitle = Mid(strContent, InStr(1, strContent, “
Else
strTitle = “無(wú)標(biāo)題”
End if //檢查被檢索文件中是否含有
searfile=objFile.Path
searfile=replace(searfile,RealPath,VirtualPath,1,-1,1)
//用虛擬路徑來(lái)替換實(shí)際路徑(包含文件名)得到文件的完整的虛擬路徑
searfile=replace(searfile,“\\”,“/”)
strCount = strCount + 1
Response.Write “” strCount “ - ” strTitle “”
strDeTag = “”
Do While InStr(strContent, “<”)
strDeTag = strDeTag “ ” Left(strContent, InStr(strContent, “<”) - 1)
strContent = MID(strContent, InStr(strContent, “>”) + 1)
Loop
strDeTag = strDeTag strContent '得到刪去tag的所有文本
pos=InStr(strDeTag,strText)
i=1
While(pos>1 AND i<50)
pos=pos-1: i=i+1 Wend
If pos=0 Then Response.Write “檢索字在標(biāo)簽中,不予顯示”
Else Response.Write replace(Mid(strDeTag, pos,100),strText,
“” strText “”,1,-1,bolCaps)
End If
Response.Write “URL: ” searfile
end If
End If
End if
Next
For Each objSubFolder in objFolder.SubFolders
schSubFolder(objSubFolder)
Next
End Sub
本文提供了一種比較成熟的站內(nèi)搜索方案,實(shí)現(xiàn)了關(guān)鍵字大小寫(xiě)、顯示關(guān)鍵字附近內(nèi)容、無(wú)限下級(jí)目錄檢索等,具有很強(qiáng)的應(yīng)用價(jià)值。只要肯思考,簡(jiǎn)單的知識(shí)和細(xì)節(jié)同樣可以實(shí)現(xiàn)復(fù)雜的應(yīng)用。程序在分頁(yè)顯示、檢索日志等方面還有待進(jìn)一步改進(jìn),如果與數(shù)據(jù)庫(kù)檢索結(jié)合進(jìn)行,將產(chǎn)生強(qiáng)大的功能。
(作者單位:山東濟(jì)南鐵道職業(yè)技術(shù)學(xué)院;山東建筑大學(xué))