摘 要: 針對(duì)目前學(xué)習(xí)平臺(tái)中信息簡(jiǎn)單羅列、組織層次不清晰的問(wèn)題,利用.net平臺(tái)上的ASP.Net、SilverLight技術(shù)設(shè)計(jì)實(shí)現(xiàn)了一個(gè)B/S架構(gòu)的知識(shí)網(wǎng)絡(luò)系統(tǒng)。分析了樹(shù)形結(jié)構(gòu)的特點(diǎn),提出了遞歸尋路徑法,將知識(shí)信息層次清晰地展現(xiàn)給用戶(hù),并實(shí)現(xiàn)節(jié)點(diǎn)間路徑的獲取。通過(guò)對(duì)Lucene.Net全文檢索技術(shù)的研究,將其與SQL Server數(shù)據(jù)庫(kù)的索引技術(shù)相結(jié)合,實(shí)現(xiàn)了一個(gè)高效的檢索引擎。
關(guān)鍵詞: 知識(shí)網(wǎng)絡(luò); .Net; Lucene.Net; 全文檢索
隨著計(jì)算機(jī)技術(shù)及網(wǎng)絡(luò)的普及,人們對(duì)知識(shí)的獲取不只來(lái)源于學(xué)校課堂,很大一部分來(lái)源于網(wǎng)絡(luò)平臺(tái)。如何為用戶(hù)提供一個(gè)層次清晰、內(nèi)容豐富的網(wǎng)絡(luò)學(xué)習(xí)平臺(tái),成為國(guó)內(nèi)外的研究熱點(diǎn)及網(wǎng)絡(luò)教學(xué)的趨勢(shì)[1]。傳統(tǒng)的網(wǎng)絡(luò)學(xué)習(xí)平臺(tái)大都信息分類(lèi)簡(jiǎn)單,知識(shí)脈絡(luò)不夠清晰,而檢索系統(tǒng)大多是基于數(shù)據(jù)庫(kù)系統(tǒng)自帶的查詢(xún)命令,如“like%keyword%”的形式實(shí)現(xiàn)檢索。這種檢索方法不能分詞、不夠智能、檢索結(jié)果的排列順序也不夠合理。針對(duì)傳統(tǒng)網(wǎng)絡(luò)學(xué)習(xí)平臺(tái)的不足,本文提出的新型的網(wǎng)絡(luò)學(xué)習(xí)系統(tǒng)不僅提供對(duì)知識(shí)信息的解讀,還分析知識(shí)內(nèi)部的聯(lián)系,梳理知識(shí)脈絡(luò),將知識(shí)以立體網(wǎng)絡(luò)的形式展現(xiàn)給用戶(hù),從而使用戶(hù)對(duì)知識(shí)信息有更立體深刻的了解;同時(shí)為了能夠保證用戶(hù)高效、準(zhǔn)確地檢索到需要的信息,本系統(tǒng)的檢索模塊中引入了新型的專(zhuān)用于.Net平臺(tái)的Lucene.Net全文檢索技術(shù)。Lucene.Net是一個(gè)類(lèi)庫(kù), 提供了簡(jiǎn)單的函數(shù)接口, 可以方便地嵌入到各種應(yīng)用中實(shí)現(xiàn)全文索引與檢索功能[2]。目前Lucene全文檢索技術(shù)發(fā)展迅猛,很多項(xiàng)目都使用了Lucene作為其后臺(tái)的全文檢索引擎,如Nutch(WebCrawler工具),Hadoop(基于Lucene的分布式計(jì)算平臺(tái))等[3]。本文通過(guò)對(duì)Lucene.Net的分析研究,將其與SQL Server數(shù)據(jù)庫(kù)技術(shù)相融合,實(shí)現(xiàn)效率高、搜索結(jié)果準(zhǔn)確的檢索引擎模塊。
1 系統(tǒng)設(shè)計(jì)
本系統(tǒng)將零散的知識(shí)信息收集起來(lái),進(jìn)行科學(xué)的整理、分類(lèi),組織成一個(gè)知識(shí)網(wǎng)絡(luò),通過(guò)高效的檢索模塊,用戶(hù)可以查找到需要的信息,同時(shí)對(duì)知識(shí)的整體結(jié)構(gòu)也有了立體的了解。根據(jù)對(duì)系統(tǒng)的功能性需求及特色的分析,將系統(tǒng)分為如圖1所示的6個(gè)模塊。
1.1 系統(tǒng)模塊功能簡(jiǎn)介
(1) 知識(shí)點(diǎn)信息資源模塊
此模塊收集信息,對(duì)信息進(jìn)行科學(xué)的整理、分類(lèi)、存儲(chǔ),將存儲(chǔ)在數(shù)據(jù)庫(kù)中的信息層次化地展現(xiàn)在客戶(hù)端頁(yè)面。
(2) 知識(shí)點(diǎn)網(wǎng)絡(luò)模塊
此模塊在收集信息資源時(shí),建立信息之間的父子或兄弟關(guān)系,并將這種關(guān)系存儲(chǔ)在數(shù)據(jù)庫(kù)中,逐步構(gòu)建知識(shí)的網(wǎng)絡(luò)結(jié)構(gòu),為用戶(hù)提供清晰、立體的知識(shí)表現(xiàn)形式。
(3) 系統(tǒng)搜索引擎模塊
利用SQL Server自有的索引功能及Lucene.Net全文檢索技術(shù),建立高效的檢索系統(tǒng),通過(guò)識(shí)別用戶(hù)輸入的檢索詞,系統(tǒng)地進(jìn)行模糊或精確查詢(xún),找到符合用戶(hù)要求的相關(guān)內(nèi)容,并進(jìn)行排序顯示。
(4) 問(wèn)答專(zhuān)區(qū)模塊
此模塊實(shí)現(xiàn)用戶(hù)提問(wèn)、回答、交流的功能,增加了用戶(hù)間的有效溝通,并使系統(tǒng)的設(shè)計(jì)更加人性化。
(5) 新聞通知模塊
此模塊用于管理系統(tǒng)新聞和通知,能夠?qū)崟r(shí)地將系統(tǒng)動(dòng)態(tài)顯示給用戶(hù)。
(6) 用戶(hù)管理模塊
此模塊用于對(duì)用戶(hù)的基本信息、權(quán)限及知識(shí)信息的相關(guān)操作進(jìn)行管理。
根據(jù)對(duì)上述各個(gè)模塊的分析,在SQL Server 2005中構(gòu)建了本系統(tǒng)的數(shù)據(jù)庫(kù)Knowledge,數(shù)據(jù)庫(kù)中各表之間的關(guān)系如圖2所示。
1.2 系統(tǒng)架構(gòu)
本系統(tǒng)采用B/S架構(gòu),編程語(yǔ)言為C#,所用技術(shù)為 .Net平臺(tái)下的ASP.NET、Silverlight,后臺(tái)數(shù)據(jù)庫(kù)為SQL Sever2005。從軟件設(shè)計(jì)上采用三層結(jié)構(gòu),通常意義上的三層結(jié)構(gòu)就是將整個(gè)業(yè)務(wù)應(yīng)用劃分為:表現(xiàn)層、業(yè)務(wù)邏輯層、數(shù)據(jù)訪問(wèn)層。區(qū)分層次的目的是為了實(shí)現(xiàn)“高內(nèi)聚,低耦合”。為了展現(xiàn)知識(shí)結(jié)構(gòu)的動(dòng)態(tài)網(wǎng)絡(luò),本系統(tǒng)還建立了SilverLight應(yīng)用程序?qū)印>唧w系統(tǒng)架構(gòu)如圖3所示。
2 系統(tǒng)關(guān)鍵模塊的實(shí)現(xiàn)
2.1 系統(tǒng)搜索引擎模塊
本系統(tǒng)為了保證用戶(hù)能夠高效、準(zhǔn)確地搜索到需要的信息,將適用于.Net平臺(tái)的Lucene.Net全文檢索技術(shù)和SQL Server索引技術(shù)相結(jié)合,構(gòu)建了一個(gè)新型的搜索引擎模塊。
搜索引擎模塊采用多條件檢索,知識(shí)信息的標(biāo)題、條目、編輯人、內(nèi)容都作為檢索條件存在。標(biāo)題、條目、編輯人是作為較短的信息存儲(chǔ)在數(shù)據(jù)庫(kù)中;而用戶(hù)編輯的內(nèi)容則作為一段很長(zhǎng)的信息對(duì)象存儲(chǔ)在數(shù)據(jù)庫(kù)中。為了達(dá)到比較高效的檢索效果,本模塊對(duì)不同檢索條件使用不同的檢索技術(shù)。
對(duì)于標(biāo)題、條目、編輯人檢索條件,通過(guò)建立SQL Server數(shù)據(jù)庫(kù)的聚集和非聚集索引來(lái)實(shí)現(xiàn)對(duì)它們的快速查找。標(biāo)題的ID作為主鍵聚集索引,而編輯人ID作為連接知識(shí)表和編輯人表的外鍵,設(shè)定為非聚集索引,條目ID作為條目表的主鍵聚集索引。這樣在建立好索引后,利用查詢(xún)語(yǔ)句“like%keyword%”對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢(xún),效率能夠提高50%左右。
對(duì)于用戶(hù)編輯的內(nèi)容,本文利用Lucene.Net技術(shù),實(shí)現(xiàn)全文檢索。Lucene.Net是基于Java的全文索引工具包Lucene的.Net移植版本。Lucene不是一個(gè)完整的全文檢索引擎,而是一個(gè)全文檢索引擎的架構(gòu),提供了完整的查詢(xún)引擎和索引引擎及部分文本分析引擎。Lucene的目的是為軟件開(kāi)發(fā)人員提供一個(gè)簡(jiǎn)單易用的工具包,以便在目標(biāo)系統(tǒng)中實(shí)現(xiàn)全文檢索的功能,或者以此為基礎(chǔ)建立起完整的全文檢索引擎[5]。
Lucene.Net全文檢索模塊的架構(gòu)如圖4所示。
Lucene.Net的工作流程如下:
(1) 由于是為數(shù)據(jù)庫(kù)中的內(nèi)容建立全文索引,所以建立與數(shù)據(jù)庫(kù)的連接。
(2) 利用IndexWriter創(chuàng)建索引;IndexWriter是Lucene.Net的索引器,其主要作用是對(duì)索引進(jìn)行創(chuàng)建,加入Document。其構(gòu)造函數(shù)IndexWriter(Directory d、 Analyzer a、bool create)中的參數(shù)分別代表索引路徑,使用哪種分詞類(lèi),是否重建索引[5]。
(3) 將需要檢索的數(shù)據(jù)(本文為數(shù)據(jù)表中的字段信息)轉(zhuǎn)換為Document的Field對(duì)象,然后將Document添加到索引文件中;
(4) 搜索:利用QueryParser類(lèi)對(duì)查詢(xún)字符串的解析,將查詢(xún)關(guān)鍵詞轉(zhuǎn)換為搜索用的Query;使用IndexSearcher進(jìn)行檢索;在本系統(tǒng)中用到的是Lucene.Net的多字段檢索及多索引目錄搜索,多索引目錄搜索就是要在多個(gè)索引目錄中進(jìn)行比較搜索,類(lèi)似概念在SQL中就是select * from TableA union select * from TableB。用到的檢索語(yǔ)句為:
IndexSearcher[] searchers=new IndexSearcher[2];
searchers[0]=new IndexSearcher(IndexPath0);
searchers[1]=new IndexSearcher(IndexPath1);
MultiSearcher multisearcher=new MultiSearcher(searchers);
(5) 檢索結(jié)果的顯示:Hits類(lèi)取得查詢(xún)得到的內(nèi)容。
2.2 知識(shí)點(diǎn)網(wǎng)絡(luò)模塊
一般來(lái)說(shuō)網(wǎng)絡(luò)結(jié)構(gòu)是由N個(gè)復(fù)雜的樹(shù)形結(jié)構(gòu)組成,其形狀表現(xiàn)為二維或三維網(wǎng)絡(luò),如圖5為知識(shí)網(wǎng)絡(luò)的抽象圖。而為了構(gòu)建一個(gè)立體的知識(shí)網(wǎng)絡(luò),對(duì)各知識(shí)點(diǎn)之間的關(guān)系設(shè)定、樹(shù)形結(jié)構(gòu)存儲(chǔ)、遍歷、節(jié)點(diǎn)路徑等問(wèn)題的處理顯得非常重要。此模塊主要負(fù)責(zé)兩個(gè)問(wèn)題:一是為用戶(hù)提供清晰、立體的知識(shí)網(wǎng)絡(luò);二是為用戶(hù)提供一個(gè)尋找節(jié)點(diǎn)間路徑的方法。
2.2.1 樹(shù)形結(jié)構(gòu)的存儲(chǔ)
對(duì)于以上兩個(gè)問(wèn)題的解決,都涉及到樹(shù)形結(jié)構(gòu)在關(guān)系數(shù)據(jù)庫(kù)中存儲(chǔ)方式的問(wèn)題。
樹(shù)形結(jié)構(gòu)模型為不規(guī)則、可變化、有序的,而關(guān)系數(shù)據(jù)庫(kù)為行列規(guī)則模型,是固定不變的、無(wú)序的。本文就涉及到父子關(guān)系在數(shù)據(jù)庫(kù)的存儲(chǔ)問(wèn)題[4]。目前一般有兩種方法:分段編碼法和利用父指針的任意樹(shù)法。分段編碼法即通過(guò)對(duì)樹(shù)節(jié)點(diǎn)逐級(jí)編碼,實(shí)現(xiàn)樹(shù)形結(jié)構(gòu)的存儲(chǔ)。這種方法需要預(yù)先設(shè)置分段的最大值,即樹(shù)中任意節(jié)點(diǎn)的最大子節(jié)點(diǎn)數(shù),由于各節(jié)點(diǎn)的節(jié)點(diǎn)數(shù)并不固定或均衡,容易造成內(nèi)存空間浪費(fèi)[5]。利用父指針的任意樹(shù)法,一般采用與表1類(lèi)似的表結(jié)構(gòu)。這種表結(jié)構(gòu)能夠很好地表示樹(shù)形結(jié)構(gòu)的本質(zhì),并且空間利用率很高,對(duì)于復(fù)雜的樹(shù)形結(jié)構(gòu)也能適應(yīng)。因此本文采用此存儲(chǔ)方法。
2.2.2 知識(shí)網(wǎng)絡(luò)的構(gòu)建及節(jié)點(diǎn)路徑的獲取
通過(guò)系統(tǒng)后臺(tái)整理好的知識(shí)層次關(guān)系,將關(guān)鍵節(jié)點(diǎn)的父、子、兄節(jié)點(diǎn)進(jìn)行讀取,利用SilverLight技術(shù),通過(guò)將節(jié)點(diǎn)模塊化,動(dòng)態(tài)地構(gòu)建知識(shí)網(wǎng)絡(luò)圖。
對(duì)于樹(shù)形結(jié)構(gòu)節(jié)點(diǎn)路徑的獲取,本系統(tǒng)使用遞歸尋路徑法。遞歸尋路徑法在數(shù)據(jù)表中只存放父子關(guān)系,如表1所示,并沒(méi)有進(jìn)行樹(shù)的多級(jí)編碼或設(shè)置層次列;所以若想取到某一知識(shí)點(diǎn)的全路徑,需要通過(guò)遞歸函數(shù)來(lái)獲得。
獲取某一指定節(jié)點(diǎn)路徑集的方法類(lèi)命名為:GetPath。其內(nèi)部主要函數(shù)的執(zhí)行邏輯為圖6所示。
2.3 知識(shí)點(diǎn)信息資源模塊
此模塊實(shí)現(xiàn)對(duì)知識(shí)信息資源的編輯、整理、層次化展現(xiàn)。系統(tǒng)對(duì)知識(shí)信息的整理,不能簡(jiǎn)單地以電子百科書(shū)的方式簡(jiǎn)單地羅列,而應(yīng)根據(jù)類(lèi)別、階段進(jìn)行整理。這也正是本系統(tǒng)與維基百科、百度百科這樣的電子百科平臺(tái)的不同。系統(tǒng)對(duì)每個(gè)知識(shí)信息塊下分幾個(gè)學(xué)習(xí)階段:基礎(chǔ)知識(shí)學(xué)習(xí)階段、進(jìn)階階段、高級(jí)應(yīng)用階段。每個(gè)階段又根據(jù)實(shí)際情況分設(shè)不同條目,輔助不同層次的訪問(wèn)者獲取知識(shí)財(cái)富。其基本的層次體系如圖7所示。
本文基于.net平臺(tái)上的ASP.Net、SilverLight技術(shù)設(shè)計(jì)實(shí)現(xiàn)了一個(gè)網(wǎng)絡(luò)學(xué)習(xí)系統(tǒng),對(duì)系統(tǒng)中各個(gè)模塊的功能進(jìn)行了簡(jiǎn)要概述。詳細(xì)分析了系統(tǒng)主要模塊的功能實(shí)現(xiàn)。在知識(shí)網(wǎng)絡(luò)模塊中,系統(tǒng)對(duì)于樹(shù)形結(jié)構(gòu)在關(guān)系數(shù)據(jù)庫(kù)中的存儲(chǔ),采用了父指針的任意樹(shù)法,此方法更適用于復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu)的存儲(chǔ)與構(gòu)建,對(duì)于節(jié)點(diǎn)路徑的獲取,系統(tǒng)提出了遞歸尋路徑法,更加準(zhǔn)確、快速地實(shí)現(xiàn)了節(jié)點(diǎn)之間路徑的獲??;在搜索引擎模塊中,對(duì)于全文檢索的實(shí)現(xiàn),使用了Lucene.Net技術(shù),將Sql的模糊檢索改進(jìn)為L(zhǎng)ucene下多條件字段和多索引目錄的全文檢索,并將Lucene.Net的全文檢索技術(shù)與SQL Server的索引技術(shù)相結(jié)合,構(gòu)建了一個(gè)新型的搜索引擎模塊,大大提高了檢索效率和檢索的精確度。
參考文獻(xiàn)
[1] WELSH E T, WANBERG C R, BROWN K G. et al. Elearning: emerging uses, empirical results and future directions[J].International Journal of Training and Development, 2003, 7(4):245-258.
[2] 譚文堂,賀明科,李 阜.基于Lucene.Net的分布式全文檢索系統(tǒng)[J].計(jì)算機(jī)應(yīng)用與軟件,2009, 26(9):142-145.
[3] 丘哲,符滔滔,王學(xué)松.開(kāi)發(fā)自己的搜索引擎[M].北京:人民郵電出版社,2010.
[4] 姚雄偉,劉莉,邸書(shū)靈,等.在數(shù)據(jù)庫(kù)上實(shí)現(xiàn)一種高效顯示的任意樹(shù)形結(jié)構(gòu)[J].河北省科學(xué)院學(xué)報(bào),2005,22(4):15-17.
[5] 夏明偉,劉星沙.父子結(jié)點(diǎn)樹(shù)的樹(shù)枝串的形成方法[J].科技咨詢(xún)導(dǎo)報(bào),2007(13):152-153.