本人有個愛好就是看到網上好的文章就收藏起來。目前機器上有250M的文章了,並都已按時間,目錄分類存放好。但是在查找時發現很不方便。所以想自己建一個全文索引的知識庫。
在方案選擇上有ms sql server的全文檢索和index server可以用。為了做個決定,自己提出了如下需求。
要求知識庫以後可以按時間,依目錄拆分;
要求支持word,xls,txt,ppt,帶圖片的html;
可以擴展支持aspx,pdf;
需求分析:
對於以上兩個問題,sql server好像不能很好的滿足:
原因1:我要把硬盤上的文章導到數據庫裡,工作量很大。其次sql server差異備分=備分時刻與第一次的全備份的差異。如果有本次差異備分=第一次全備分+前N次備分那就好了。
原因2:由於很多文章是HTML的。帶圖片。放到sql server裡就有個一對多的問題。解決不了。
原因3:全文檢索的填充不能實時進行。
原因4:文章放到數據庫image類型字段後,必須通過程序來查看。沒有直接放在硬盤上查看方便。
所以最終選擇index server.
過程:
(在這裡我們取名KB,要索引的文章在D:\知識庫\C#知識庫,建成後的索引文件放在D:\KB)
啟動Windows 2000 /XP上的索引;
缺省情況下選擇圖標位於管理工具組中的計算機管理。窗口的右邊提供關於當前在服務器上存在的索引信息。默認有兩個索引:System和Web;
要創建新的索引,用鼠標右鍵單擊索引服務或右邊的面板,選定新建編錄。
顯示添加編錄對話框,指定索引的名稱並用浏覽按鈕選取位置。索引服務不會立即開始索引,此時將彈出一條消息框,單擊確定繼續。為了達到最佳的性能,索引服務可以放在和Web服務器隔離開的硬盤上 ;
指定索引的目錄,用右鍵單擊新建的編錄名,從彈出選單中選定屬性,將出現如圖2所示的對話框。第一個選項卡常規顯示剛剛輸入的內容,在第二個選項卡跟蹤中的WWW服務器下拉列表中選取你要索引的Web網站 ;
有了創建的編錄,現在可以挑選你想在索引中包括的目錄。
實現方法:
用index server其實用html頁面就可以實現。參考C:\WINDOWS\Help\ciquery.htm 這是用activex 實現的。
在這裡我采用C#和oledb來實現。
微軟已經給我們提供了現成的oledb驅動來訪問index server。其中PROVIDER=MSIDXS,具體哪些列可以選擇,參看附錄。
private void BT_Search_Click(object sender, System.EventArgs e)
{
string constr="PROVIDER=MSIDXS;DATA SOURCE=KB";
OleDbConnection con=new OleDbConnection(constr);
try
{
OleDbCommand cmd=new OleDbCommand();
cmd.Connection=con;
cmd.CommandText="SELECT Rank,FileName, Create, Access, Path
FROM SCOPE()
where CONTAINS (''\""+TB_Text.Text+"\"'')";
OleDbDataAdapter da=new OleDbDataAdapter();
da.SelectCommand=cmd;
con.Open();
DataSet ds=new DataSet();
da.Fill(ds);
dataGrid1.DataSource=ds;
}
catch(Exception E)
{
Console.Write(E.Message);
}
finally
{
con.Close();
}
}
關於文檔格式擴展。為了實現對aspx,apcx可以通過增中過濾器來實現。 例如對aspx,和ascx的索引可以在注冊表中加以下注冊項。
[HKEY_CLASSES_ROOT\.aspx\PersistentHandler] ="{eec97550-47a9-11cf-b952-00aa0051fe20}"
[HKEY_CLASSES_ROOT\.ascx\PersistentHandler] ="{eec97550-47a9-11cf-b952-00aa0051fe20}"
對於pdf格式的過濾器在adobe的網站上也有。
附錄
字段名 字段類型 說明
---------------------------------------------------------------------------
Access 日期/時間 上次訪問文件的時間。
Characterization 文本/字符串 文檔的特征或摘要。由索引服務器計算。
Create 日期/時間 文件的創建時間。
Directory 文本/字符串 文件的物理路徑,不包括文件名。
DocAppName 文本/字符串 創建文件的應用程序的名稱。
DocAuthor 文本/字符串 文檔的作者。
DocByteCount 數字 文檔的字節數。
DocCategory 文本/字符串 文檔的類型,如備注、計劃或白皮書。
DocCharCount 數字 文檔中的字符數。
DocComments 文本/字符串 有關文檔的注釋。
DocCompany 文本/字符串 為其編寫文檔的公司的名稱。
DocCreatedTm 日期/時間 文檔的創建時間。
DocEditTime 日期/時間 編輯文檔所花費的總時間。
DocHiddenCount 數字 PowerPoint 文件中的隱藏幻燈片數。
DocKeywords 文本/字符串 文檔的關鍵字。
DocLastAuthor 文本/字符串 最近編輯過文檔的用戶。
DocLastPrinted 日期/時間 上次打印文檔的時間。
DocLastSavedTm 日期/時間 上次保存文檔的時間。
DocLineCount 數字 文檔中包含的行數。
DocManager 文本/字符串 文檔作者的管理者名稱。
DocNoteCount 數字 PowerPoint 文件中帶有注釋的頁數。
DocPageCount 數字 文檔中的頁數。
DocParaCount 數字 文檔中的段落數。
DocPartTitles 文本/字符串 文檔組成部分的名稱。例如,在 Microsoft Excel 中,電子表格是文檔的組成部分。在 PowerPoint 中,幻燈片是文檔的組成部分。在 Word 中,包含在主文檔中的文檔的文件名是文檔的組成部分。
DocPresentationTarget 文本/字符串 PowerPoint 演示文稿的目標格式(如 35mm、打印機、視頻,等等)。
DocRevNumber 文本/字符串 文檔的當前版本號。
DocSlideCount 數字 PowerPoint 文件中的幻燈片數。
DocSubject 文本/字符串 文檔的主題。
DocTemplate 文本/字符串 文檔的模板名稱。
DocTitle 文本/字符串 文檔的標題。
DocWordCount 數字 文檔中的字數。
FileIndex 數字 文件的唯一標識。
FileName 文本/字符串 文件的名稱。
HitCount 數字 文件中的匹配(與查詢匹配的字詞)數。
Path 文本/字符串 文件的完整物理路徑,包括文件名。
Rank 數字 行的等級號。范圍介於 0 到 1000 之間。數字越大,匹配率越高。
ShortFileName 文本/字符串 簡短 (8.3) 文件名。
Size 數字 文件大小,以字節為單位。
VPath 文本/字符串 文件的完整虛擬路徑,包括
文件名。如果有多個可能的路徑,則選擇與特定查詢最匹配的路徑。
Write 日期/時間 上次編寫文件的時間。
本文配套源碼