[C#]使用WSS執行全文檢索

[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檔案篩選器

image

控制台->索引選項

 

進階設定

image

包含位置依需求修改。

ps:我個人會排除不需要搜尋資料夾(如排除使用者資料夾、歷程紀錄、離現檔案..等),加快搜尋效能。

 

設定索引檔案屬性和內容

image

如果你沒有pdf ifilter的話,建議下載Foxit PDF IFilterAdobe PDF IFilter v6.0快很多。

 

使用Win7 搜尋 "LVM"結果:9筆

image

 

使用WSS4搜尋結果:9筆資料(和Win7相同)

image

可以看到pdf預覽亂碼,pdf和圖像檔案需要額外處理。

 

 

 

 

測試文件深度

一個word檔案插入另一word檔案

image

 

檔案內容

image

紅框為插入檔案的內容。

 

使用Win7 搜尋 "星霏"結果:5筆

image

 

使用WSS4搜尋結果:5筆資料(和Win7相同)

image

 

 

連線字串

<connectionStrings>
    <add name="mywss" connectionString="Provider=Search.CollatorDSO.1;Extended Properties='Application=Windows';" providerName="System.Data.OleDb"/>
  </connectionStrings>

 

SQL Query

image

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

 

 

參考

[ERP] 伺服器搜尋的連線字串

FREETEXT Predicate

CONTAINS Predicate

[C#]Everything SDK

使用索引改善 Windows 搜尋:常見問題集