身為一名資料蒐集愛好者,我電腦裡累積了超過 250 MB 的技術文章,雖然按時間與目錄分類妥善存放,但每次需要查找特定內容時卻極不方便。為了解決這個痛點,我決定自行建立一套全文索引的知識庫系統。
在技術選型階段,主要考慮兩個候選方案:SQL Server 內建的全文檢索功能,以及 Windows 內建的 Index Server。經過詳細需求分析後,最終選擇 Index Server,主要基於以下四大考量:
於 Windows 2000/XP 環境下,透過「電腦管理」→「服務與應用程式」→「索引服務」啟動索引功能。預設存在 System 與 Web 兩個編錄,右鍵選擇「新增編錄」,指定名稱(本例為 KB)與索引檔案存放路徑(D:\KB),建議將索引檔案置於獨立硬碟以提升效能。
在新建編錄的「屬性」→「追蹤」分頁中,選取欲索引的 Web 網站;接著透過「目錄」節點新增欲納入索引的實體目錄(本例為 D:\知識庫\C#知識庫)。
Index Server 提供 MSIDXS OLE DB Provider,可直接以 SQL-like 語法查詢。以下為核心查詢程式碼:
private void BT_Search_Click(object sender, System.EventArgs e)
{
string constr = "PROVIDER=MSIDXS;DATA SOURCE=KB";
using (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(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
dataGrid1.DataSource = ds;
}
catch (Exception ex)
{
Console.Write(ex.Message);
}
}
}
透過註冊表新增 Persistent Handler 即可擴充索引支援格式:
HKEY_CLASSES_ROOT\.aspx\PersistentHandler 及 .ascx 設定值為 {eec97550-47a9-11cf-b952-00aa0051fe20}| 欄位名 | 類型 | 說明 |
|---|---|---|
| Rank | 數字 | 相關性分數 0~1000,越高越符合 |
| FileName | 字串 | 檔案名稱 |
| Path | 字串 | 完整實體路徑含檔名 |
| DocTitle | 字串 | 文件標題(來自文件內部屬性) |
| DocAuthor | 字串 | 文件作者 |
| Create / Write / Access | 日期時間 | 建立/修改/存取時間 |
| Size | 數字 | 檔案大小(位元組) |
| Characterization | 字串 | Index Server 自動產生的文件摘要 |
| HitCount | 數字 | 符合查詢字詞的出現次數 |
本方案無需將文件搬移進資料庫,保留原始檔案結構,查詢效能優異,且擴充性極佳,非常適合中小型知識庫建置需求。