午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

FTP搜索引擎的設(shè)計與實現(xiàn)(優(yōu)化版) - 技術(shù)資料下載 - 開放式研究論壇--搜索引擎 -...

 Long_way 2007-06-20
FTP搜索引擎的設(shè)計與實現(xiàn)(優(yōu)化版)

By falcon

摘要:FTP是因特網(wǎng)最主要的服務(wù)之一,F(xiàn)TP搜索引擎為資源共享提供了極大的方便。本文分析和設(shè)計了一個基于WEB的FTP搜索引擎,在ASP+ACCESS+VB環(huán)境下給出了編程實現(xiàn),并體現(xiàn)了具體實踐中總結(jié)出的一些經(jīng)驗。

關(guān)鍵詞:FTP;搜索引擎;ASP;ACCESS;SQL;VB

引言

  FTP是因特網(wǎng)最主要的服務(wù)之一,在FTP服務(wù)器上保存有大量的各種各樣的共享軟件、技術(shù)資料和多媒體數(shù)據(jù)等文件。由于FTP服務(wù)器上的文件組織結(jié)構(gòu)比較復(fù)雜,而且文件分布不一定有規(guī)律,因此想很快的找到自己需要的資源比較困難。基于WEB的FTP搜索引擎可以很好的解決上述問題。目前,國內(nèi)外有很多 FTP搜索引擎,國內(nèi)高校中做得比較出色的有天網(wǎng)資源搜索(北大)、歪酷搜索(復(fù)旦)、星空搜索(清華)。如果能夠打造一個我校自己的FTP搜索引擎,將極大的方便校園網(wǎng)用戶共享FTP資源,進而對校園網(wǎng)的發(fā)展作出巨大的貢獻。

正文

1.FTP搜索引擎的結(jié)構(gòu)

  FTP搜索引擎由數(shù)據(jù)采集、數(shù)據(jù)查詢、數(shù)據(jù)管理和維護三大核心模塊組成。實現(xiàn)一個FTP搜索引擎,首先要獲得FTP服務(wù)器上的文件信息,并保存到數(shù)據(jù)庫中;然后為用戶提供一個查詢界面,通過把用戶提交的關(guān)鍵字轉(zhuǎn)化成數(shù)據(jù)庫查詢語言,從庫中獲取匹配的文件信息,并以友好的界面返回給用戶。另外,為了保持數(shù)據(jù)庫和服務(wù)器信息的同步更新、保證庫中數(shù)據(jù)量等,引入數(shù)據(jù)管理和維護的功能模塊。下面是FTP搜索引擎的結(jié)構(gòu)圖示:

使用的相關(guān)軟件和語言說明:
操作系統(tǒng):Windows XP
WEB服務(wù)器:IIS
數(shù)據(jù)庫查詢語言:SQL
數(shù)據(jù)庫系統(tǒng):ACCESS
WEB頁編程語言:html+asp+javascript
數(shù)據(jù)采集工具編程語言:VB。

2. 數(shù)據(jù)庫結(jié)構(gòu)的分析和設(shè)計

  從FTP搜索引擎的結(jié)構(gòu)圖示中不難看出,數(shù)據(jù)庫是整個系統(tǒng)的核心部分。它是三大功能模塊設(shè)計的基礎(chǔ)。下面先對三個模塊和數(shù)據(jù)庫之間的關(guān)系進行一定的分析。
數(shù)據(jù)采集模塊需要通過訪問FTP服務(wù)器獲取文件信息,那么不難想到把FTP站點信息和文件信息保存到數(shù)據(jù)庫中。另外數(shù)據(jù)查詢模塊的主要操作對象也正好是文件信息,因此需要訪問數(shù)據(jù)庫。另外,為了方便用戶更好的查詢,引入關(guān)鍵字統(tǒng)計等模塊并把統(tǒng)計信息保存到數(shù)據(jù)庫中。而數(shù)據(jù)管理和維護的對象涉及對站點信息的更新以及文件信息與服務(wù)器的同步,比如添加刪除站點,重新獲取FTP服務(wù)器的文件信息等,也涉及到數(shù)據(jù)庫的操作。
下面就文件信息、站點信息、關(guān)鍵字統(tǒng)計信息等幾個方面考慮數(shù)據(jù)庫的設(shè)計。

2.1文件信息分析

  在FTP服務(wù)器上,文件系統(tǒng)都是樹形結(jié)構(gòu)的,其中包括目錄和文件,而每個文件包括文件名(隱含類型)、文件地址、文件大小、日期等信息,其中最為重要的信息莫過于文件地址,用戶通過它可以進行下載等操作。據(jù)此,我們可以設(shè)計出文件信息表,但是出于對數(shù)據(jù)庫冗余度,以及必要的優(yōu)化等方面考慮,我們先從文件系統(tǒng)結(jié)構(gòu)、文件信息的自身性質(zhì)等進行進一步分析。
1)文件系統(tǒng)的結(jié)構(gòu)是樹形的,我們必須設(shè)法把它轉(zhuǎn)換成現(xiàn)在流行的關(guān)系數(shù)據(jù)庫中的表結(jié)構(gòu)。
2)如果每個文件的URL地址都保存到一個字段中,那么將由于他們有相同的目錄而產(chǎn)生極大的數(shù)據(jù)冗余。因此應(yīng)該設(shè)法把冗余度降低。
3)通常要獲得的是文件而非目錄。因此可以設(shè)想把文件和目錄保存到不同的表中。
4)由于文件一般都由文件后綴來指定文件類型,因此可以據(jù)此設(shè)置一個類型字段來對文件進行分類,甚至可以據(jù)此把文件表劃分成更細的表。
通過分析后不難想到引入類似靜態(tài)鏈表中的游標(biāo)來建立樹形結(jié)構(gòu)和表結(jié)構(gòu)的聯(lián)系,于是,我們設(shè)計出這樣的表結(jié)構(gòu):(目前只劃分為【目錄表】和【文件表】來存放文件信息)
【目錄表】:cat_tab
字段名   字段類型
目錄編號(id)   Integer
目錄名(cat)   Text(50)
父目錄編號(pid)   Integer
所屬IP站點編號(ipid)   Integer
訪問次數(shù)(acctime)   long
這里的id和pid實現(xiàn)了類似靜態(tài)鏈表中的游標(biāo),極大的優(yōu)化了數(shù)據(jù)庫,而且使得查詢操作更加方便。而ipid是該表和站點表之間的關(guān)系字段,指定目錄所屬的站點,至于訪問次數(shù),是為了使得查詢返回結(jié)果更人性化,下同。
【文件表】:file_tab
字段名   字段類型
文件名(file)   Text(50)
后綴(postfix)   Text(4)
父目錄編號(pid)   Integer
所屬IP站點編號(ipid)   Integer
訪問次數(shù)(acctime)   long
這里的pid指向目錄表中的id,據(jù)此建立文件表目錄表之間的聯(lián)系。

2.2 FTP站點信息分析

  一個FTP站點通常包括服務(wù)器名(域名或者IP)、開放的端口號、用戶名和密碼、站點說明信息等。保存FTP站點信息表的結(jié)構(gòu)具體設(shè)計如下:
【站點表】:site_tab
字段名   字段類型
IP編號(id)   Integer
站點地址(site)   Text(15)
端口(port),默認為21端口   Integer
登陸用戶名(user),默認為anonymous   Text(10)
登陸密碼(pw),默認為falcon@   Text(10)
當(dāng)前是否可以訪問(acc)   Boolean
該站數(shù)據(jù)是否已經(jīng)入庫(indb)   Boolean
站點說明信息(info)   備注型
“當(dāng)前是否可以訪問”字段,是為數(shù)據(jù)管理和維護模塊以及數(shù)據(jù)查詢模塊設(shè)計的,前者通過“站點連接測試”獲取該信息,而數(shù)據(jù)查詢模塊據(jù)此判斷是否返回該站點的信息給用戶,從而保證返回結(jié)果的有效性。而該站點數(shù)據(jù)是否入庫與是否可訪問信息結(jié)合起來作為查詢的ipid(站點id編號)的域。另外,它可以為數(shù)據(jù)采集時是否還需要采集該站點數(shù)據(jù)作依據(jù)。

2.3 關(guān)鍵字統(tǒng)計信息分析

  經(jīng)過實踐發(fā)現(xiàn),對關(guān)鍵字的統(tǒng)計非常重要,它可以幫助用戶更好的查詢。該信息可以單獨提供給用戶訪問,也可以在用戶每次訪問時把類似的關(guān)鍵字信息顯示給用戶,讓用戶通過對比觀察其他用戶查詢的關(guān)鍵字而找到更好的查詢辦法。目前該表只設(shè)置關(guān)鍵字信息和被成功搜索次數(shù)信息。
【關(guān)鍵字統(tǒng)計表】key_tab
字段名   字段類型
關(guān)鍵字(key)   Text(25)
訪問次數(shù)(acctime)   Long

2.4數(shù)據(jù)庫結(jié)構(gòu)設(shè)計

經(jīng)過分析和初步的設(shè)計,我們的數(shù)據(jù)庫基本成型。它包括四個表,分別是【目錄表】、【文件表】、【站點表】、【關(guān)鍵字表】,表名分別為cat_tab, file_tab,site_tab,key_tab。出于系統(tǒng)整體風(fēng)格的考慮,所有的命名全部采用小寫以及特殊文件名命名的見名知義原則。另外該數(shù)據(jù)庫的名字根據(jù)站點的名字而來,取為falcon_search.mdb,為了在數(shù)據(jù)庫安全方面的考慮,實際命名為#falcon_search.asp。

3. 數(shù)據(jù)采集

  要構(gòu)建FTP搜索引擎,必須通過自動方式采集FTP服務(wù)器上的文件信息,并以相對完善的格式保存到上面設(shè)計好的數(shù)據(jù)庫中。這個過程大體如下:
該模塊先從站點表中獲取站點的必須信息進行站點登陸、遍歷等操作,與此同時接收FTP站點返回的文件信息,并進行一定的優(yōu)化后把目錄和文件分別保存到目錄表和文件表中,另外在數(shù)據(jù)入庫后把站點表中是否入庫標(biāo)記置為真。這里涉及到兩個個子核心模塊:站點遍歷以及數(shù)據(jù)過濾。
前者可以通過站點遍歷過程實現(xiàn)(可以是遞歸的,也可以用堆棧實現(xiàn)的非遞歸過程);而后者的數(shù)據(jù)過濾涉及到對大量站點數(shù)據(jù)的統(tǒng)計分析后才能做出妥善的安排,從而為提高整個站點的性能做出非常大的貢獻,比如,過濾掉一些“黃色”字眼可以凈化網(wǎng)絡(luò)環(huán)境,過濾掉垃圾文件可以精簡數(shù)據(jù)庫的到小并且使得用戶能夠獲得盡可能滿足要求的信息,而對某些特殊的文件名進行過濾不但可以壓縮數(shù)據(jù)庫,而且可以提高訪問效率。比如,沒有意義的文件名(如純數(shù)字的),用戶永遠都不會去查詢即使查詢到也不知道該文件是否滿足需要,因此把這類文件信息過濾掉也相當(dāng)重要,不過,它們所處的目錄命名往往是有意義的,因此保留目錄信息不但可以方便用戶查詢到相關(guān)信息,而且上面過濾掉的文件信息實質(zhì)上依然可以為用戶所利用,即可以通過它們所在的目錄訪問到。
  下面先把數(shù)據(jù)采集的算法用自然語言描述如下:
數(shù)據(jù)采集過程{
    從庫中讀取站點信息;
    登陸站點并遍歷;
    接收返回信息并過濾;
    數(shù)據(jù)入庫;
}
然后我們具體分析每個細節(jié):

3.1從庫中讀取站點信息

這里我們需要設(shè)計一個數(shù)據(jù)結(jié)構(gòu)來保存站點數(shù)據(jù),設(shè)計時完全參照表中的相關(guān)字段設(shè)置。下面主要介紹VB連接數(shù)據(jù)庫的操作,以及記錄型數(shù)據(jù)的設(shè)計。
A,VB連接數(shù)據(jù)庫:
先引用Microsoft DAO 3.6 Object Library,然后就可以通過下面的代碼實現(xiàn)對Access的連接。
Set mydb = DBEngine.OpenDatabase(“數(shù)據(jù)庫的絕對路徑”)
至于執(zhí)行sql語句,可以這樣實現(xiàn):
Set myrs = mydb.OpenRecordset(sql語句)
B,記錄型數(shù)據(jù)的設(shè)計:
我們來設(shè)計一個存放每個站點信息的記錄型數(shù)據(jù)結(jié)構(gòu):
Const siteLen = 15
Const userLen = 10
Const pwLen = 10
Const infoLen = 1000
Public Type siteStructure
Id As Integer
Site As String * siteLen
Port As Integer
User As String * userLen
Pw As String * pwLen
Acc As Boolean
Indb As Boolean
Info As String * infoLen
End Type
注:上面聲明了一些常量,目的是為了方便日后的系統(tǒng)的維護。

3.2登陸站點和遍歷以及數(shù)據(jù)過濾

實際操作過程中,我們把“站點遍歷”和“數(shù)據(jù)接收“放到一起考慮。為什么把它們放在一起呢?因為遍歷的過程也是接收數(shù)據(jù)的過程,它們并不是純粹的順序關(guān)系,而是并行關(guān)系。該部分是數(shù)據(jù)采集過程的核心。因此需要詳細的分析。
為了實現(xiàn)站點的登陸和遍歷,我們有兩種實現(xiàn)方案。
方案一,可以使用vb6.0提供的Winsock控件,它提供了基于TCP協(xié)議的套接字連接,可以通過它實現(xiàn)ftp協(xié)議,而我們要做的僅僅是實現(xiàn)ftp協(xié)議客戶端,并且只需實現(xiàn)登陸、發(fā)送list命令和接收返回信息即可。
方案二,vb6.0也提供了一個更高級的internet transfer control6.0,該控件使得底層的ftp協(xié)議透明化,我們無需知道ftp協(xié)議的底層實現(xiàn)過程就可以通過它進行類似dos下ftp命令操作。用dir 命令就可以實現(xiàn)對對方目錄的文件列表操作,而且可以在該控件的狀態(tài)改變事件中判斷狀態(tài)并在合適狀態(tài)下接收數(shù)據(jù)。
通過分析,不難發(fā)現(xiàn),兩者都可以實現(xiàn)我們的需求。前者在操作控制方面比后者麻煩,些,不過比后者靈活,比如超時控制更自由。而且前者有個優(yōu)點,容易通過load(裝載)多個控件來實現(xiàn)多線程。
為了設(shè)計的方便,我們這里采取第二個方案。我們把這“站點遍歷”和“數(shù)據(jù)接收”分成兩個過程來考慮。站點登陸和遍歷過程實際上是一個命令發(fā)送過程,而后面的接收數(shù)據(jù)和數(shù)據(jù)過程可以放到控件的狀態(tài)改變過程中實現(xiàn)。兩個過程的細化如下:
命令發(fā)送過程{
  (登陸并進入服務(wù)器的根目錄)
  通過遞歸實現(xiàn)進入子目錄,直到遍歷完所有目錄
  (通過引入堆棧來實現(xiàn)非遞歸算法,后序遍歷樹)
}
  控件的狀態(tài)改變過程{
  判斷服務(wù)器是否響應(yīng)完成,如果是執(zhí)行下面操作:
    接收數(shù)據(jù)
    數(shù)據(jù)過濾
    數(shù)據(jù)存入臨時變量中
}
同樣,為了保存每個文件的信息,我們得設(shè)計一個存放文件的記錄型數(shù)據(jù)。每個文件包括文件編號、父目錄編號、文件名(或目錄名)、文件后綴(目錄后綴為” /”,文件后綴從文件名拆分出來)、文件深度(指所處文件系統(tǒng)中目錄的層次,這是為了便于遍歷而設(shè)置,并不入庫)另外,為了實現(xiàn)非遞歸,我們設(shè)計一個堆棧來存放遍歷過程中的目錄,為了保存最終的結(jié)果,我們設(shè)計一個數(shù)組(即上面提到的臨時變量)來存放。由于目錄個數(shù)和文件信息總量的預(yù)先不可估量,我們采取動態(tài)數(shù)組來實現(xiàn)它們。
  這里記錄型數(shù)據(jù)的設(shè)計同3.1,這里介紹一下VB中動態(tài)聲明數(shù)據(jù)的方法:
先通過Dim定義一個空的數(shù)組,然后通過Redim重新定義,如:
Dim TestArray() as string ‘以前的聲明
Redim preserve TestArray(數(shù)組大小) as string ‘重新聲明

現(xiàn)在,我們來設(shè)計數(shù)據(jù)過濾方案:
數(shù)據(jù)過濾在介紹數(shù)據(jù)采集過程時有了初步的介紹,總結(jié)一下,我們分幾個級別來進行過濾:
第一級別,不區(qū)分文件和目錄,我們過濾掉所有包含有特定字眼的信息,如黃色、色情等;過濾掉那些長度超過數(shù)據(jù)庫中定義的相關(guān)字段最大長度的信息。
第二級別,過濾某些目錄,比如bin/,Program Files/,新建文件夾/等,其中包含的信息,往往并不是人們需要的。
過濾掉某些文件,其中有一個辦法就是通過后綴過濾掉好多文件,另外,也可以通過文件名來過濾,比如readme,新建 Microsoft Word 文檔,新建 文本文檔等,他們通常也是一無所用的。
第三級別,前兩個級別都是在數(shù)據(jù)過濾階段進行,但是這個級別是數(shù)據(jù)入庫之前。這里也是為了過濾掉某些文件,但是這些文件有一些特別:只是它們的命名沒有任何意義。比如純數(shù)字命名,但是它們的目錄往往是非常有用的,所以它們自身被過濾掉,而目錄保留下來。
到目前為止,數(shù)據(jù)過濾就差不多拉,完全可以通過ini文件來保存某些要過濾的文件,或者需要保留的文件,從而使得程序具有很好的擴充性。
現(xiàn)在介紹一下Microsoft internet transfer控件登錄FTP站點時涉及的一些操作:
我們先通過添加component來導(dǎo)入該組件,并添加到窗體中,命名為inet1
1),數(shù)據(jù)采集過程部分
A,在命令發(fā)送之前,我們得進行一些初始化操作。
Inet1.URL ‘ftp站點的Url地址
Inet1.RemotePort ‘ftp站點開放的端口號
Inet1.UserName ‘登錄用戶名
Inet1.Password ‘登錄密碼
而在窗體初始化的時候,初始化下面兩個屬性
Inet1.Protocol = icFTP ‘使用的網(wǎng)絡(luò)協(xié)議
Inet1.AccessType = icUseDefault ‘是否直接連接,這里選擇默認,即使用當(dāng)前IE的設(shè)置。
現(xiàn)在介紹命令發(fā)送:
Inet1.execute ,“cd ” & “目錄”
Inet1.execute ,“dir ”
我們可以通過該控件的execute方執(zhí)行cd和dir命令來實現(xiàn)登陸FTP以及數(shù)據(jù)遍歷操作。
B,控件狀態(tài)接收端,我們可以在該控件的狀態(tài)改變事件觸發(fā)過程中判斷狀態(tài),并在適當(dāng)時候接收數(shù)據(jù)和處理數(shù)據(jù)。
Private Sub Inet1_StateChanged(ByVal State As Integer)
Dim filelistTmp as string,filelistArray() as string
If State = 12 Then
filelistTmp = Inet1.GetChunk(0) ‘這里filelistTmp用來接收文件列表信息
  fileArray = Split(filelistTmp, vbCrLf) ‘由于接收到的數(shù)據(jù)是用換行符分割著的,這樣我們用分割函數(shù)就可以取得每個文件名
    ‘這里進行進一步的處理,包括數(shù)據(jù)過濾數(shù)據(jù)以及存入臨時變量等操作
  end if
  end sub
2),數(shù)據(jù)過濾
我們采取的三種方案都是沒有經(jīng)過仔細的統(tǒng)計分析后做出的,所以可能存在這樣的問題:即剔除了某些重要的文件信息。但是權(quán)衡利弊后,我們發(fā)現(xiàn):它對數(shù)據(jù)庫的信息的壓縮和優(yōu)化來說起到了非常重要的作用。因此,目前需要改進的是在對大量站點信息進行統(tǒng)計分析以及對其他一些相關(guān)工作(比如“命名學(xué)“方面的知識等)進行學(xué)習(xí)和研究后得出更科學(xué)的過濾方案。但是過濾措施的提出似乎是一個“創(chuàng)舉”。我們可以從另外一個角度減少建設(shè)搜索引擎站點的成本。
至于具體的實現(xiàn)可以查看源代碼,其實只進行了比較簡單的比較和判斷操作。具體實現(xiàn)時把上面的幾個不同級別的過濾方法寫到一個過程里拉。目的是為了日后程序的維護。

3.3數(shù)據(jù)入庫

這里主要是把經(jīng)過過濾和優(yōu)化后的數(shù)據(jù),即把臨時變量中的數(shù)據(jù)保存到數(shù)據(jù)庫中。這里同樣涉及連接數(shù)據(jù)庫和sql語句的執(zhí)行,具體同3.1。但是操作是比較方便的,原因是臨時變量的結(jié)構(gòu)和數(shù)據(jù)庫中表的結(jié)構(gòu)非常類似。
它主要涉及到對原有站點記錄的刪除操作,可以通過myrs.delete和myrs.update來實現(xiàn);另外還涉及數(shù)據(jù)的追加操作,可以通過myrs.addnew和myrs.update來實現(xiàn)。
最后這里有個需要注意的問題:就是在執(zhí)行記錄刪除操作后,庫的大小并不會因此而變小,而需要你進行數(shù)據(jù)庫壓縮后才會真正釋放掉空間,因此我們在每次執(zhí)行刪除記錄操作后專門通過DBEngine.CompactDatabase方法來實現(xiàn)。

至此數(shù)據(jù)采集過程分析完畢,具體代碼參見源程序。

4. 數(shù)據(jù)查詢

  通過數(shù)據(jù)采集我們獲得了查詢需要的數(shù)據(jù),下面將具體分析和實現(xiàn)數(shù)據(jù)查詢模塊。
數(shù)據(jù)查詢主要包括查詢頁面的設(shè)計、查詢程序的編寫和查詢結(jié)果的返回以及關(guān)鍵字統(tǒng)計等。查詢頁面由Web服務(wù)器提供,用于收集所要查找的文件信息,用戶瀏覽到此Web頁面,填寫并提交表單。為減少Web服務(wù)器的工作量,提交時由客戶端對關(guān)鍵字進行過濾。表單中需包含文件名信息,另外為方便用戶查找特定類型的文件,設(shè)置一個下拉菜單供用戶選擇文件類型。表單提交給Web服務(wù)器之后,由查詢程序進行分析,生成查詢語句并執(zhí)行查詢操作,查詢結(jié)果由查詢程序進行統(tǒng)計分析,并按搜索次數(shù)排序、以分頁的方式返回給用戶瀏覽。查詢結(jié)果主要包含文件在第三方服務(wù)器上的符號鏈接地址,以及相關(guān)關(guān)鍵字等信息。另外,查詢結(jié)果的統(tǒng)計信息保存到關(guān)鍵字統(tǒng)計表中。與此同時,還可以據(jù)此更新目錄表和文件表中的搜索次數(shù)字段。
數(shù)據(jù)查詢的具體過程圖示如下:

下面詳細分析和設(shè)計WEB提交頁面和查詢程序。

4.1 WEB提交頁面的設(shè)計

經(jīng)過對常用搜索引擎的分析,發(fā)現(xiàn)提交頁面都非常簡單實用,我們的做法也是這樣。下面是我們的提交頁面:
通過上面的圖片,我們看到提交內(nèi)容的地方只有三個:關(guān)鍵字輸入文本框、文件類型選擇下拉框、以及搜索設(shè)置復(fù)選框。我們就這三個表單元素的作用進行分析。
A,關(guān)鍵字輸入框:這里是用戶輸入搜索關(guān)鍵字的地方,用戶可以輸入單個或者多個關(guān)鍵字,另外可以進行模式匹配操作,例如,可以輸入“mp3:童年”來搜索文件名為童年的mp3。
B,文件類型選擇框: 通過這里用戶可以縮小搜索范圍,從而找到更滿足自己要求的文件。這里需要詳細解釋一下具體的分類情況。
全部:包括所有的目錄和文件,需搜索目錄表和文件表
目錄:只包括目錄,僅搜索目錄表
一下只搜索文件表,根據(jù)文件后綴分類(這里的分類是可以擴展)
圖片:jpg,gif,bmp,ico
影音:mp3,rm,wav,wma,mid,wmv,rmvb,mpg,swf,avi,asf
壓縮:rar,zip,iso,tar,gz,tgz,tbz,bz2
文檔:txt,doc,htm,html,pdf,ppt,chm,pdg
軟件:exe,rpm,bin
源碼:c,cpp,java,asm
其他:dll,w3x,conf等
C,搜索設(shè)置:為了保證搜索結(jié)果是有效的,所以設(shè)置該項非常有用。它可以盡量保證結(jié)果的有效性。
表單的內(nèi)容設(shè)置好以后,就涉及到提交過程拉,提交過程是這樣的:
用戶單擊提交按鈕或者按下{Enter}鍵,觸發(fā)提交事件,并使網(wǎng)頁轉(zhuǎn)向表單的action屬性所指向的查詢程序所在頁面。
為了減輕WEB服務(wù)器的一些負擔(dān),我們在客戶端通過javascript或者vbscript來對用戶輸入的關(guān)鍵字進行一定的過濾。比如,過濾掉空串、不雅、以及常見字或者詞語。

4.2 查詢程序

通過數(shù)據(jù)查詢過程圖示可以看出,“查詢程序”是整個“數(shù)據(jù)查詢”模塊的核心。而查詢程序本身包括幾個大的方面:接收提交頁面提交的信息;將接收的信息進行區(qū)分和處理并轉(zhuǎn)換成查詢語句;連接數(shù)據(jù)庫并執(zhí)行查詢語句進行查詢操作;對查詢結(jié)果進行分頁處理和統(tǒng)計分析;將結(jié)果返回給用戶。
為了能夠比較透明的描述查詢程序,先看看查詢結(jié)果頁面。

可以看出,這里具體包括查詢提交模塊、用戶搜索的設(shè)置以及搜索結(jié)果總數(shù)、頁數(shù),查詢過程耗費的時間以及返回給用戶的文件信息,另外還有相關(guān)搜索的顯示等。
由于涉及到的內(nèi)容比較多,我們這里只簡單介紹幾個最關(guān)鍵的地方,詳細情況參看源代碼:
第一部分,時間統(tǒng)計部分,該部分其實只需要在連接數(shù)據(jù)庫之前先設(shè)置一個時間變量,記為SearchStartTime用系統(tǒng)時鐘Timer賦值,然后在執(zhí)行完查詢語句后用當(dāng)前的時鐘減去SearchStartTime就可以拉。
第二部分,從關(guān)鍵字的接收、查詢語句的生成、連接數(shù)據(jù)庫并執(zhí)行查詢語句、通過分頁返回結(jié)果、關(guān)鍵字的統(tǒng)計幾個方面來介紹。
1)關(guān)鍵字的接收有兩種方法:
如果查詢提交頁面中的表單方法屬性設(shè)成get即method=get。假如我們要接收關(guān)鍵字信息,并設(shè)提交頁面的相應(yīng)表單元素名為key,那么可以在結(jié)果返回頁面(我們命名為search.asp)中用request.querystring(“key”).value來取得。
如果查詢提交頁面中的表單方法屬性設(shè)成post即method=post,那么可以在結(jié)果返回頁面中用request.form(“key”).value來取得。
2)關(guān)鍵字的處理與查詢語句的生成
A,多關(guān)鍵字的處理
我們通過asp中的一個分割函數(shù)把包含空格的關(guān)鍵字拆分成多個,然后生成查詢語句中條件。
B,根據(jù)不同的分類來查找不同的表或者不同的字段
之前我們得接收“文件類型”參數(shù),并且定義一個數(shù)組,分別存放不同“文件類型”參數(shù)對應(yīng)的文件后綴。然后根據(jù)“文件類型”參數(shù)的不同取值并結(jié)合上面得到的查詢條件來生成不同的查詢語句。
當(dāng)文件類型為“全部”時,需要聯(lián)合查詢目錄表和文件表。用到SQL查詢中的聯(lián)合查詢技術(shù)。
另外,在查詢文件表中不同的類時,還需要用in來限定查詢的文件后綴的范圍。
C,根據(jù)接收的“搜索設(shè)置”的值來決定是否訪問站點表,來獲取當(dāng)前開機的ftp站點編號來限定訪問目錄表和文件表中對應(yīng)編號,從而加強上面得到的查詢語句的條件。
到這里查詢語句就可以生成拉。
另外,上面提到了模式匹配。這里可以通過分析關(guān)鍵字中是否包含“:”解析一個“文件類型”值,從而和上面的根據(jù)“文件類型”生成查詢語句一樣進行處理。
3)連接數(shù)據(jù)庫和執(zhí)行查詢語句
在asp中一個比較好的連接數(shù)據(jù)庫的方法是DAO連接:
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq="+Server.MapPath("庫名")
driver是驅(qū)動器參數(shù),而dbq是數(shù)據(jù)庫所在的絕對路徑,通過Server對象的mappath以及當(dāng)前路徑就可以獲得。
至于執(zhí)行查詢語句,就這么簡單
set rs = Server.CreateObject("ADODB.Recordset")
rs.open 查詢語句(這里是我們在上面生成的查詢語句)
4)數(shù)據(jù)返回和分頁顯示
這里涉及到查詢的效率問題,通過總結(jié)分析Asp優(yōu)化的方法以及具體實現(xiàn),發(fā)現(xiàn)先用set方法把記錄放到內(nèi)存變量中能有效提高搜索的效率,如:set id=rs(id字段的編號)
然后直接可以在后面通過使用id的值來使用該記錄信息。
而分頁的設(shè)置也有好多措施,但是原理大都一樣,我們只介紹具體使用到的分頁技術(shù)中的一些主要參數(shù):
rs.PageSize 設(shè)置每頁的記錄數(shù)   
rs.PageCount 總的頁數(shù)
rs.CacheSize 設(shè)置頁緩沖區(qū)
5)相關(guān)搜索顯示以及統(tǒng)計分析
相關(guān)搜索是通過訪問統(tǒng)計表,查找出與當(dāng)前查詢的關(guān)鍵字近似的關(guān)鍵字信息。
而統(tǒng)計分析是通過當(dāng)前查詢的關(guān)鍵字來更新關(guān)鍵字統(tǒng)計表。
6)實踐過程中引入的一個比較重要的技術(shù)
在返回的結(jié)果中,提供給用戶的連接并不是某個文件或者目錄的url地址,而是它在數(shù)據(jù)庫中的索引信息,即文件的父目錄編號和所屬的站點編號。而這些信息全部存放在目錄表中。這樣做有兩個非常大的好處:能夠很好的提高搜索效率,而且減少服務(wù)器的工作量。
如果返回的結(jié)果中就是文件的url地址,那么獲取url地址的過程將耗費很多時間,因為對每個文件都要執(zhí)行該操作。而且取得每個文件的url地址的過程需要訪問數(shù)據(jù)庫的次數(shù)都非常大。
而做了上面的處理后,我們可以節(jié)省獲取url地址的時間,從而可以做大更快把文件信息返回給用戶。與此同時,用戶如果想下載某個文件,同樣可以通過點擊連接按鈕打開一個獲取url地址的頁面,而這個頁面包含地址重定向功能,在訪問數(shù)據(jù)庫后找到url地址并引導(dǎo)用戶打開該地址。
可想而知,用戶的最大操作可能是打開所有的文件。這樣的情況數(shù)據(jù)庫的訪問量才和一次性給出所有文件地址的操作量相當(dāng),但大多數(shù)情況下,用戶只選擇其中的某些結(jié)果。因此,該改進對可以明顯降低對數(shù)據(jù)庫的訪問次數(shù),減少WEB服務(wù)器的負荷。

5. 管理與維護

  通過數(shù)據(jù)采集和數(shù)據(jù)查詢模塊的分析和設(shè)計,我們基本實現(xiàn)了一個FTP搜索引擎,但是還需要相關(guān)的數(shù)據(jù)更新和維護。
這里的數(shù)據(jù)更新包括“站點可連接性的測試”,校園網(wǎng)內(nèi)新開通的FTP站點的登記等,我們這里是通過winsock控件來實現(xiàn)的。只需要通過它來登錄ftp站點就可以拉。
另外,站點采集最好是做成自動化的,從而較少人為的操作負擔(dān)。
這樣一個相對完善的FTP搜索系統(tǒng)就已經(jīng)完成拉。

6. 其他功能

  通過對其他ftp搜索引擎的分析發(fā)現(xiàn),大都有站點快照功能,經(jīng)過仔細的分析和設(shè)計后,終于完成基于原有的數(shù)據(jù)庫就很快實現(xiàn)拉。
  站點快照功能有個好處,可以引導(dǎo)用戶快速的瀏覽某個ftp站點下的文件并進行下載等操作。
  這里有兩種設(shè)計方案:
  第一種,“天網(wǎng)”的樹形單頁結(jié)構(gòu),這里把文件系統(tǒng)的結(jié)構(gòu)完美的體現(xiàn)出來拉。而且瀏覽起來很方便。
  第二種,“星空”的表形多頁結(jié)構(gòu),這里其實只是對表結(jié)構(gòu)的一個簡單“翻譯”,而且它同我們平時訪問ftp服務(wù)器見到的界面差不多,只是瀏覽的數(shù)據(jù)很能有很大的提高,而且頁面排布可以更美觀些。
  由于時間等方面因素,暫時本搜索引擎只實現(xiàn)第二種方案。在時間允許的情況將實現(xiàn)第二種方案。

結(jié)束語

  我們設(shè)計的FTP搜索引擎已經(jīng)在網(wǎng)站上運行了兩個多月,為校園網(wǎng)用戶提供了很好的服務(wù)。訪問量到現(xiàn)在已經(jīng)超過1萬次。最近和usmot共同推出了最新版本——“獵鷹搜索”。對數(shù)據(jù)采集和數(shù)據(jù)查詢、數(shù)據(jù)的更新維護、以及WEB頁面的設(shè)計方面都做了優(yōu)化,效果比較好,當(dāng)然也存在一些不足。隨著搜索引擎技術(shù)的不斷發(fā)展,我們將繼續(xù)秉著為校園網(wǎng)添彩、為校園網(wǎng)用戶服務(wù)的熱情繼續(xù)努力,推出更好的FTP搜索服務(wù)。另外,我們打算把該項目轉(zhuǎn)到linux下,作為開源項目來開發(fā),具體打算采用php+c+mysql模式。我們期待著會有新的收獲。

參考文獻:

1,張運凱 劉宏忠 郭宏剛 《FTP搜索引擎的設(shè)計與實現(xiàn)》
2,(美國)MICROSOFT公司 《Visual Basic 6.0 控件參考手冊》
3,《用asp制作強大的搜索引擎》 http://www./20051126204241/
4,《SQL參考手冊》http://www./quickcheck/sql/
5,《ASP基礎(chǔ)教程》
http://www.ahtvu./jxc1/wshd ... %CA%E9/homepage.htm
6,《ASP網(wǎng)頁的優(yōu)化》http://www.linkwww.com/article/list.asp?id=16
7,歪酷搜索頁面風(fēng)格http://www./


其他說明:
1,   該FTP搜索引擎目前的測試地址:falcon.96.cn
2,   本人聯(lián)系方式:qq:253087664 Email:falcon_search@eyou.com
3,   關(guān)于詳細源代碼的下載問題,暫時不提供下載,以后可以到“蘭大ftp聯(lián)盟QQ群:18301157”查看詳細源代碼的發(fā)布地址”。申請加入時請輸入:“蘭大ftp聯(lián)盟”字樣,以表明自己身份,謝謝。
4,   由于打算到Linux下做ftp搜索引擎的開源項目,大家如果有興趣,可以聯(lián)系本人,或者加入上面的群,也可以到falcon.96.cn下的BBS留言。
5,   由于falcn.96.cn為申請的二級域名,可能不穩(wěn)定,以后也許訪問不了,那么請原諒。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多