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