小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

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

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

By falcon

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

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

引言

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

正文

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

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

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

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

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

2.1文件信息分析

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

2.2 FTP站點(diǎn)信息分析

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

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

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

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

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

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

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

3.1從庫(kù)中讀取站點(diǎn)信息

這里我們需要設(shè)計(jì)一個(gè)數(shù)據(jù)結(jié)構(gòu)來(lái)保存站點(diǎn)數(shù)據(jù),設(shè)計(jì)時(shí)完全參照表中的相關(guān)字段設(shè)置。下面主要介紹VB連接數(shù)據(jù)庫(kù)的操作,以及記錄型數(shù)據(jù)的設(shè)計(jì)。
A,VB連接數(shù)據(jù)庫(kù):
先引用Microsoft DAO 3.6 Object Library,然后就可以通過(guò)下面的代碼實(shí)現(xiàn)對(duì)Access的連接。
Set mydb = DBEngine.OpenDatabase(“數(shù)據(jù)庫(kù)的絕對(duì)路徑”)
至于執(zhí)行sql語(yǔ)句,可以這樣實(shí)現(xiàn):
Set myrs = mydb.OpenRecordset(sql語(yǔ)句)
B,記錄型數(shù)據(jù)的設(shè)計(jì):
我們來(lái)設(shè)計(jì)一個(gè)存放每個(gè)站點(diǎn)信息的記錄型數(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)的維護(hù)。

3.2登陸站點(diǎn)和遍歷以及數(shù)據(jù)過(guò)濾

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

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

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

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

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

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

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

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

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

經(jīng)過(guò)對(duì)常用搜索引擎的分析,發(fā)現(xiàn)提交頁(yè)面都非常簡(jiǎn)單實(shí)用,我們的做法也是這樣。下面是我們的提交頁(yè)面:
通過(guò)上面的圖片,我們看到提交內(nèi)容的地方只有三個(gè):關(guān)鍵字輸入文本框、文件類型選擇下拉框、以及搜索設(shè)置復(fù)選框。我們就這三個(gè)表單元素的作用進(jìn)行分析。
A,關(guān)鍵字輸入框:這里是用戶輸入搜索關(guān)鍵字的地方,用戶可以輸入單個(gè)或者多個(gè)關(guān)鍵字,另外可以進(jìn)行模式匹配操作,例如,可以輸入“mp3:童年”來(lái)搜索文件名為童年的mp3。
B,文件類型選擇框: 通過(guò)這里用戶可以縮小搜索范圍,從而找到更滿足自己要求的文件。這里需要詳細(xì)解釋一下具體的分類情況。
全部:包括所有的目錄和文件,需搜索目錄表和文件表
目錄:只包括目錄,僅搜索目錄表
一下只搜索文件表,根據(jù)文件后綴分類(這里的分類是可以擴(kuò)展)
圖片: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è)置該項(xiàng)非常有用。它可以盡量保證結(jié)果的有效性。
表單的內(nèi)容設(shè)置好以后,就涉及到提交過(guò)程拉,提交過(guò)程是這樣的:
用戶單擊提交按鈕或者按下{Enter}鍵,觸發(fā)提交事件,并使網(wǎng)頁(yè)轉(zhuǎn)向表單的action屬性所指向的查詢程序所在頁(yè)面。
為了減輕WEB服務(wù)器的一些負(fù)擔(dān),我們?cè)诳蛻舳送ㄟ^(guò)javascript或者vbscript來(lái)對(duì)用戶輸入的關(guān)鍵字進(jìn)行一定的過(guò)濾。比如,過(guò)濾掉空串、不雅、以及常見(jiàn)字或者詞語(yǔ)。

4.2 查詢程序

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

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

5. 管理與維護(hù)

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

6. 其他功能

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

結(jié)束語(yǔ)

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

參考文獻(xiàn):

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


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

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

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多