[C#]使用WSS執行全文檢索
這幾天都在尋找Search engine資源,查詢非結構文件我之前使用Index Service來處理,
但未來MS打算主打Windows Search,
因為公司目前要重新開發二代文管系統,目前公司全文檢索是使用SQL 2008 full text search 並搭配第三方搜尋引擎龍XX,
搭配第三方搜尋引擎主因為SQL2008全文檢索查詢中文關鍵字結果很不理想(為了查詢效能,所以SQL2005後都採用斷詞),
所以透過第三方搜尋引擎來彌補,
題外話~~~
我個人認為全文檢索中文在SQL2012有滿大改善,我之前測試一些中文無意義詞彙在SQL2008都找不到,
但使用SQL2012大部分都沒問題(參考[鐵人賽][Denali 新特性探險16]Semantic Search(1)、[鐵人賽][Denali 新特性探險17]Semantic Search(2)),
只要有人問我全文檢索中文有無辦法提高準確度,我都會建議使用SQL2012並搭配自定義斷詞字典可以解決大部分問題,
但因公司前不久才升級SQL2008,所以升級或自定義斷詞字典(過於被動)是行不通的,
拜G大神測試幾個open source search engine大部分問題不外乎是中文支援度不成熟(結果顯示亂碼、找不到或是更本不支援)、
查詢深度不足(word檔案內崁word檔案找不到)和不支援PDF/圖像內容(可惜Everything SDK只能搜尋檔名無法搜尋檔案內容),
正打算使用Lucene .NET(快是很重要的)作為我個人Search engine base時,
璉大指引我一條明燈~~Windows Search,自己紀錄一下。
測試PDF內容查詢
確認PDF檔案篩選器
控制台->索引選項
進階設定
包含位置依需求修改。
ps:我個人會排除不需要搜尋資料夾(如排除使用者資料夾、歷程紀錄、離現檔案..等),加快搜尋效能。
設定索引檔案屬性和內容
如果你沒有pdf ifilter的話,建議下載Foxit PDF IFilter比Adobe PDF IFilter v6.0快很多。
使用Win7 搜尋 "LVM"結果:9筆
使用WSS4搜尋結果:9筆資料(和Win7相同)
可以看到pdf預覽亂碼,pdf和圖像檔案需要額外處理。
測試文件深度
一個word檔案插入另一word檔案
檔案內容
紅框為插入檔案的內容。
使用Win7 搜尋 "星霏"結果:5筆
使用WSS4搜尋結果:5筆資料(和Win7相同)
連線字串
<connectionStrings>
<add name="mywss" connectionString="Provider=Search.CollatorDSO.1;Extended Properties='Application=Windows';" providerName="System.Data.OleDb"/>
</connectionStrings>
SQL Query
private DataTable Query(string keyword,string searchpath)
{
string sqlstatement = string.Format(@"SELECT top 1000 System.ItemFolderPathDisplay,System.ItemName,System.DateModified,System.ItemType, System.KindText,System.Search.AutoSummary,System.Search.Rank
FROM SYSTEMINDEX
WHERE SCOPE='file:{0}'
and CONTAINS(System.ItemType,'"".doc"" or "".docx"" or "".pdf"" or "".jpg"" or "".xls"" or "".xlsx"" or "".jpg"" or "".jpeg"" or "".msg""')
and (System.ItemName like '%{1}%' or CONTAINS('%{1}%') )
order by System.Search.Rank desc", searchpath, keyword);
DataTable result = new DataTable();
using (OleDbConnection conn = new OleDbConnection(connstr))
{
using (OleDbCommand comd = new OleDbCommand(sqlstatement, conn))
{
OleDbDataAdapter da = new OleDbDataAdapter(comd);
da.Fill(result);
}
}
return result;
}
下一篇在來測試Lucene.net(因為公司檔案數量相當龐大)~~~超快的search engine
參考