安徽農業大學校園網始建于 2000 年,現有信息網點一萬多個,學生用戶二萬多人,FTP 服務器是校園網主要的應用服務之一。在 FTP 服務器上目前保存著多種共享軟件、技術資料和多媒體數據等幾十個 TB 的文件資源。FTP 服務器建有若干目錄,文件與目錄結構存在多樣性、復雜性,學生要想在FTP 服務器上找到自己需要的文件,很麻煩,即使按照目錄名( 文件夾) 點擊,也需要好幾層才能找到自己所需要的文件,無法快速搜索、定位,更別提進行數據文件的統計、學生需求應用的查詢等,若要在多個 FTP 服務器上查找文件更是困難?;趪鴥缺贝筇炀W、百合谷搜索和 FTP 星空搜索的搭建思路,構建安徽農業大學自己的 FTP 搜索引擎,便于省內其他高校進行類似建設,也為了進一步提高校園網的應用服務水平,我們團隊根據高校的實際需求情況,以 Linux 系統為平臺,利用 Apache、MySQL、PHP和 Python,設計并開發了 FTP 搜索引擎。
1 FTP 搜索引擎原理
FTP 搜索引擎采用 C / S 模式,Server 端進行數據采集和處理( 入庫) ,Client 進行關鍵詞搜索,然后Server 進行數據處理,最后返回結果。故采用以下思路來進行模塊式分析、解決:
( 1) 數據的存儲方式( 數據庫設計) ;( 2) 如何采集數據( 多線程) ;( 3) 查詢時 Server 端處理數據( 分詞,限定條件) 并返回,同時將結果顯示給用戶。
FTP 搜索引擎由數據采集、數據查詢和站點維護等模塊組成。建立一個 FTP 搜索引擎,首先要收集各個 FTP 站點上的文件信息,并把這些信息存儲到配置文件中; 然后給用戶提供查詢界面,以獲取用戶要查詢的信息,把這些查詢信息轉化為數據庫語言,然后再進行數據庫查詢,把查詢結果以友好的界面顯示給用戶; 搜索引擎建好后,為了使數據庫數據與 FTP 站點的數據保持一致,還需要更新 FTP 站點的文件信息、添加新的 FTP 站點等管理和維護工作。FTP 搜索引擎的結構[1]如圖 1 所示。
設計 FTP 搜索引擎時,操作系統采用 Linux,WWW 服務器采用 Apache,數據庫采用 MySQL,編程語言采用 PHP 和 Python,其中 Python 作為遍歷腳本。
2 數據庫結構和設置
2. 1 文件信息分析
安徽農業大學 FTP 站點上,根目錄下的目錄中有許多子文件夾和文件,其中每個文件信息又包括:
文件名、文件大小、文件地址、日期、類型等屬性。對應這些文件信息,在數據庫中設置相應的字段,用來記錄這些信息,用字段 name 存儲文件名( 不大于255 個字符) ,將其設置為 varchar 類型,長度為 255,host 表示 FTP 網站的名稱,說明是哪個 ftp 網站上的文件,dir 字段準確給出文件的 URL 地址。由于有些文件的 URL 比較長,因此把 dir 字段類型設置為longtext.有了這些字段,就可以在網絡中找到此文件的位置。當然還需要記錄下文件的大小、時間、日期,以便用戶分辨選擇他們所要的文件。另外為提高查詢速度( 查詢時對文件名字段的訪問比較頻繁) ,文件名字段設置成 Index 字段。文件表結構見表 1、表 2,數據庫結構見圖 2.
2. 2 FTP 站點信息分析
一個 FTP 站點通常包含服務器名稱、用戶名和密碼。對應 FTP 站點的信息,數據字段設置如下:
站點名、站點 IP 地址、用戶名、用戶密碼等幾個字段。站點名字段類型為 vchar,長度為 60; IP 地址為vchar 類型,長度為 50; 用戶名為 vchar 類型,長度為50; 密碼設置為 password 類型,長度為 60.由于 FTP站點名也是使用較為頻繁的數據,因此把它設置為Index 字段。
3 數據采集
首先收集各個 FTP 站點的文件信息,記錄到數據庫里,用于提供搜索。因特網中有許多 FTP 站點,要收集某個 FTP 站點的文件信息時,就從數據表中讀出站點信息,然后登陸到該 FTP 站點。大部分 FTP 服務器都有公共訪問區,即公用 FTP,我校對全校師生員工提供免費的文件信息服務,用戶名為public,密碼為 public,目前限制為校內才能訪問。
數據采集程序以用戶名和密碼登陸站點,然后對該站點所有目錄進行采集,讀取每個目錄下的文件信息,在收到文件信息后,對其進行分析,將文件信息存儲到相應的數據表字段中。完成此站點的數據采集之后,再讀取另外一個 FTP 站點的信息,進行文件信息采集,如此循環,從而采集所有已知 FTP 站點的文件信息。為了加快遍歷速度,這里采用了python 的進程和線程技術,經過測試,遍歷 30 萬條記錄只需要 10 分鐘左右。
由于獲取 FTP 信息在使用深度優先和廣度優先上算法是相同的,這里使用的是深度優先算法。
獲取目錄信息主要使用的是遞歸來遍歷文件和文件夾信息,有一個主函數的作用是遍歷文件,存入該文件的名稱和目錄信息到數據庫中。當得到的是文件目錄時,則繼續重復調用該函數,進入該目錄繼續遍歷,直至完成整個目錄的遍歷為止。這樣,我們存入數據庫就包括一個文件,含有所屬站點、文件名稱( 文件格式) 、路徑等信息,如圖 3 所示。
為了增量獲取信息,可以通過設定計劃任務在每天的凌晨來啟動遍歷程序,這樣可以確保新增的文件可以及時存入到數據庫中,有效保證數據庫文件的及時性、準確性。
計劃任務: 00***root python / opt / ftpspider. py
抓取腳本:
#! / usr / bin / python
#encoding = utf - 8
#導入模塊
import os,re,types,MySQLdb,sys,codecs,threading
from multiprocessing import Process,Pool
from ftplib import FTP
#連接 FTP
def link( username,password,ip) :
ftp = FTP( ip)
login = ftp. login( username,password)
return ftp
#獲取文件信息并存入數據庫
def getfile( ftp,path,ip) :
ftp. cwd( path)
for file in ftp. nlst( ) :
dir = path + ' / ' + file
try:
ftp. cwd( dir)
dir = ftp. pwd( )
#多線程獲取文件信息
t = threading. Thread( target = getfile,args =
( link( ) ,dir) )
t. start( )
t. join( )
except:
dir = path
name = file
#將文件信息存入數據庫
sql = “ insert into file values ( ” ,' + ' + ip
+ ',' + path + ',' + name + ‘) ’“
insert( sql)
def insert( sql) :
conn = MySQLdb. Connect ( user = ' root',passwd
= ” ,db = ' ftp',host = ' 192. 168. 77. 5',charset = '
utf8‘)
cur = conn. cursor ( cursorclass = MySQLdb. cur-
sors. DictCursor)
cur. execute( “ SET NAMES utf8” )
cur. execute( sql)
rows = cur. fetchall( )
conn. commit( )
cur. close( )
conn. close( )
#獲取 FTP 站點信息
def ftpinfo( ) :
conn = MySQLdb. Connect ( user = ' root',passwd
= “ ,db = ' ftp',host = ' 192. 168. 77. 5',charset = 'utf8’)
cur = conn. cursor( cursorclass = MySQLdb. cur-
sors. DictCursor)
cur. execute( ” SET NAMES utf8“ )
cur. execute( ” select* from ftpinfo“ )
rows = cur. fetchall( )
return rows
conn. commit( )
cur. close( )
conn. close( )
#啟動該腳本
def start( ) :
addr = ftpinfo( )
for info in addr:
username = info['username']
password = info['username']
ip = info['ip']
ftp = link( username,password,ip)
#多進程
p = Process( target = getfile,args = ( ftp,' / ',ip) )
p. start( )
start( )
4 數據查詢
數據查詢主要包括查詢 web 頁面的設計、程序編寫和查詢結果的輸出處理。查詢頁面由 Web 服務器提供,用戶瀏覽該頁面,填寫并提交搜索信息,如文件名、大小等。然后將該信息提交給 Web 服務器,由查詢程序進行處理,再生成查詢語句,提交至SQL 服務器進行查詢。查詢結果則由查詢程序進行處理,以超鏈接形式生成 Web 頁面,便于用戶瀏覽,獲悉結果[1].
為進一步實現文件細分,引導搜索,增加便利性,我們仿照其他全文搜索引擎的樣式并結合本校FTP 站點文件的現狀,決定按照文件格式的區分來進行分類搜索,主要依據是文件的格式( 文件的后綴名) ,比如。 doc、。 rar 等。當用戶檢索關鍵詞時,我們可以通過如下 sql 語句來進行 mysql 的多字段檢索匹配,其中三個字段 site( 站點) 、name( 文件名或類型) 、dir( 目錄) 中的任何一個字段和給出的關鍵詞相同的話即可返回結果。Sql 語句[2]如下:
select* from ' file' where concat( site,name,dir)like'% 關鍵詞%5 搜索結果處理。
5. 1 搜索結果分頁
分頁顯示,即數據庫中的結果集,一段一段顯示出來,包括: 怎么分段、當前在第幾段 ( 每頁有幾條,當前在第幾頁) 分頁公式:
( 當前頁數 -1) × 每頁條數,每頁條數
Select* from table limit ( S| Page - 1) * S| PageS-ize,S| PageSize
前 10 條記錄: select* from table limit 0,10.
5. 2 關鍵詞推薦
用戶每次檢索記錄后,我們都會將搜索過的關鍵詞存入到數據庫中,在首頁會有一個最近搜索詞的推薦,便于用戶知道其它人最近檢索的是什么,我們也可以直接插入關鍵詞到數據庫中。根據這些關鍵詞,作為校園網的一項重要服務,就可以有針對性地上傳特定的更具體的資源。關鍵詞推薦效果如圖4 所示。
關鍵詞推薦效果的具體實現過程如下:
S| sql = “ select DISTINCT history. 'key' from histo-
ry; ” ;
S| query = mysql_query( S| sql) ;
while( S| rs = @ mysql_fetch_array( S| query) ) {
S| return. = getlabel( S| rs['key']) ;
}
echo S| return;
/ / 獲得推薦關鍵字隨機樣式
function getlabel( S| key) {
S| label_style = array(
'0' = > 'label label-primary',
'1' = > 'label label-success',
'2' = > 'label label-info',
'3' = > 'label label-warning',
'4' = > 'label label-danger',
'5' = > 'label label-warning',
'6' = > 'label label-danger',
) ;
/ / 返回最新關鍵詞標簽
return“ < a href = '#'class = ‘” . S| label_style[rand
( 0,6) ]. “' > ”. S|key. “ < /a > ”;
}
5. 3 搜索結果自動分類
傳統的 FTP 搜索引擎一般都是根據用戶提交的查詢詞,在索引數據庫中匹配,然后對檢索結果按相關度排序。誠然,相關度排序能夠將較重要的結果信息反饋給用戶,但也存在著一詞多義與多詞同義的問題,使得檢索結果依然很難滿足不同用戶的需求。為了改進檢索結果的質量,采用: 根據 FTP文件擴展名標識,其次利用 K - 群近鄰算法對檢索結果的文件名分類,這樣檢索結果就有了層次結構,從而進一步方便了用戶查找,而且提高了用戶的獲取效率。搜索結果如圖 5 所示。
6 自定義 FTP 服務器地址
對于 FTP 服務器地址的管理,設置一個專門的配置文件,該配置文件僅只讀權限,且無法下載。該文件保存以下信息: FTP 服務器的地址,用戶名和密碼。數據結構使用的是二維數組,如 S| ftp_site = ar-ray( '0' = > array ( ' ip' = > '210. 45. 176. 32',' user-name' = > 'public','password' = > 'public‘) ,
'1' = > array ( ' ip' = > '210. 45. 176. 24',' user-name' = > 'public','password' = > 'public’) ) ;
當執行遍歷程序時,會在后臺讀取該文件,一個站點遍歷完成后,則會遍歷下一個 FTP 站點。
7 搜索引擎維護與性能優化
搜索引擎維護,其中重要的一點就是數據庫數據與 FTP 站點的數據保持一致,維護中包括增加、顯示、刪除及更改 FTP 站點等功能。另外,為了實現站點文件信息自動更新的功能,把更新 FTP 站點文件信息的程序( ftp. php) 設置成系統周期性計劃任務,如日凌晨1∶ 00 運行 1 次。
結合其他 Web 搜索引擎的優點,我們采用了全文索引方式,即先對網頁進行中文分詞,然后提取關鍵詞項對數據文件建立倒排索引表[3].經過學生的調查統計分析,用戶在 FTP 搜索引擎中查詢的文件類型主要是電影、軟件、歌曲、視頻等。FTP 文件名大致可分 4 種類型: 純英文、純中文、中英文混排、其它等[3].我校 FTP 服務器中存儲的文件: 12% 的文件為純英文命名,45% 的文件是中英文混排命名,32% 的文件是純中文命名,其它命名形式占 11% ,以上命名比例在視頻與電影文件命名中尤為突出。
因此,在設計搜索引擎索引文件結構時應對中文作更多的優化。由于中文字符集的常用漢字數比英文字母多,所以兩者的編碼方式不同[4],英文是單字節,而中文要用兩個字節來存儲,且雙字節索引的性能比單字節的要高,因此在考慮兼容性與性能的基礎上,FTP 搜索引擎采用雙字節倒排索引技術,即對文件名中每兩個字節建立倒排索引表。
ALTER TABLE ' file' ADD FULLTEXT INDEX 'filename‘( 'name’)
8 結論
介紹了高校 FTP 搜索引擎的設計與實現,重點展示了系統所采用的關鍵技術和方法,對構建思路、程序設計、語句實現等方面進行了系統、具體的闡述。目前該搜索引擎已經在安徽農業大學校園網上使用,為用戶提供了很好的服務,得到了用戶的普遍好評。下一步將繼續就搜索引擎的分布式處理、支持 IPV6、進一步提高查詢速度、更高效的分類檢索、滿足移動終端需求、跨高校的 FTP 站點群共享等方面的技術進行研究,努力讓高校 FTP 搜索引擎能更好地服務于廣大師生員工。
參考文獻:
[1]汪劍,牟奇春,王霖,等。 基于 SQL SERVER 的 FTP 搜索引擎系統的設計[J]. 軟件導刊,2008,7( 6) : 93 -95.
[2]鐘偉財。 精通 PHP4. 0 與 MySQL 架構 Web 數據庫實務[M]. 北京: 中國青年出版社,2000.
[3]武海燕。 基于校園網的 FTP 搜索引擎的研究與實現[J]. 中國電子商務,2010( 2) : 53 -54.
[4]石小梅,劉克劍。 FTP 搜索引擎索引技術的研究[J]. 西南民族大學學報: 自然科學版,2012,38( 3) : 475 -477.