程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 基於MS Index Server的全文索引實現

基於MS Index Server的全文索引實現

編輯:關於VC++

本人有個愛好就是看到網上好的文章就收藏起來。目前機器上有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 日期/時間 上次編寫文件的時間。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved