hit counter for blogger

黑暗執行緒

 黑暗執行緒搬新家囉!! http://www.darkthread.net

4/15/2006

Community Server 2.0的中文檢索功能


CommunityServer 2.0的功能真是酷到不行,結合了許多AJAX的前端技巧,除了原本應用FreeTextBox的RichText編輯功能外,甚至在UI直接Doble-Click就可以開始修改頁面上的文字,讚嘆之餘,也開始覺得這一行愈來愈不好混了,未來客戶的UI規格要求恐怕會以這種水準為基礎向上加,理由很簡單,不要錢的Open Source Project都做得到,你好意思做得比他還差嗎?
最近因為工作需要,正在規劃一個企業入口網站,由於SPS/WSS內建的討論區功能實在陽春到令人想吐,而討論區的功能偏偏又是企業內部數一數二的熱門應用,因此我打算把華麗的CS2.0整合進來。評估了一下,有三大難關:
1.我只需要Forums的功能,Blogs與Photos的功能暫不開放免得自找麻煩,看來CommunityServer並沒有設計開關讓我直接停用,幸好NavigationBar上可以藉由修改SiteUrls.config移去不需要的Link,加上不開放給任何人建立Blog或Photos,應該就OK了。如果還不放心,還可以將Blogs、Photos目錄給刪了,就真的萬無一失了。
2006-04-16 後來發現根本不用這麼麻煩,CS2.0有內建Blog、Form、Photo...等各項功能停用與否的設定UI,所以點一點就可以了。真是個好軟體!
2.由於CS預設是使用Forms認證,為了跟SPS結合,非用Windows認證不可。Telligent Systems雖然有賣
Windows Authentication Add-On,但它要價USD 399! 而且在我的需求中,還需要做到使用者第一次登入CS時,由HR的資料庫取得姓名、Email等資料,立刻自動註冊成合法會員,就算買了Add-On,這一段恐怕還有客製上的Issue。因此索性自已動手修改了User.cs、CommonDataProvider.cs、SqlCommonDataProvider.cs,加入查詢HR資料表的功能,再改了Logon.aspx加入以Request.ServerVariables["LOGON_USER"]帳號自動登入,最後,若發現該帳號非會員則自動註冊的機制,這部分的功能就算齊了。
3.另外,查了Google發現許多人抱怨CS的Search檢索功能不能查中文。試了一下,果然,輸入中文字查詢時,會查到全部的文章,因此結論是預設的CS2.0,是無法查中文的。
Trace Code之後發現,CS用英文字串HashCode的做法實作檢索功能,有效率是有效率,但是此法完全未考慮到當關鍵字是中文的情況。再查了Google,竟意外連至朋友Rex的Blog,其中展示
了如何以T-SQL LIKE來實作可以支援中文的查詢功能。
拜讀過Rex的大作讓我信心大增,不過Rex修的是CS1.1,CS2.0的程式配置與做法都有調整,看來得DIY了。
我修改了SearchTerms.cs的GetSearchTerms,在遇到中文時,不要啟用TokenizeKeywords程序,否則所有中文都會被濾掉,接著還改寫出GetAndOrKeywordsNonEN,以便能處理中文關鍵字串中的AND、OR符號。
另外,SerachBarrelProvider.cs是另一個改寫重點。我將SearchText改寫成SearchTextLike(這個概念來自於Rex的啟發,感謝啦!),其中的差異在於原本查詢cs_SearchBarrel比對WordHash的做法改為直接Query cs_Posts資料表,並用LIKE '%關鍵字%'的手法比對Subject與Body兩個欄位,我讓
GetSearchResults會視關鍵字中有無中文(有無中文的檢測是透過System.Text.Encoding.GetEncoding("big5").GetBytesCount()計算BIG5編碼長度與原始字長度比較,當二者不同時,表示其中有全形字),來決定要用SearchText或是SearchTextLike。如此,可以在更動最少的情況下,讓CS支援中文查詢。
當然,用LIKE查詢有兩個問題,第一是原本查詢結果有權重的觀念,LIKE完全無法提供;第二點是未來若資料量變大,預估沒效率的LIKE '%...%'將會造成效能問題。
長久之計,應該還是要回歸SQL 2000/2005的FullText Search,一方面效能較佳,二來FreeTextTable的功能提供了RANK,可以仿效權重(雖然由實測的結果,始終不覺得RANK能反應所謂的"符合度")。只是這需要DB Schema端的配合,細節也要構思一下,就當成下一階段的目標吧!
想要參考SearchTerms.cs與SerachBarrelProvider.cs原始碼修改的朋友,可以到這裡下載。

6 Comments:

Post a Comment

<< Home