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:
只有一句話…
太。強。了。
佩服佩服
By Anonymous, at 4/15/2006 6:05 pm
我有修改過那些Code,但還是沒辦法正確搜尋
可否將您的DLL檔借我測試
By Anonymous, at 6/12/2006 5:47 pm
To dmwc,
呃... 由於後來又陸續針對我的需求,改了數個地方(我加上了AD整合式認證),可能直接引用DLL會有些困難。
有試過我附上可下載的兩個cs嗎? 我建議用SQL Profiler監看一下改版後送出的T-SQL指令,看看是否修改有生效。或是將問題細節再說明一下,我看看可否幫上忙。
Jeffrey
By Darkthread, at 6/13/2006 11:05 am
我不曉得是不是環境的差異,我在MSDE + CWin2003 和 SQL2005(E) + EWin2003 情況下,都是跑出不正確的結果,不然就是您只有開Blog,但我是全部服務都開
在經過我半天的測試,後來有找到一個致命的Bug,修正那個Bug後,就正常了
如:
Bug 說一下,搜尋 Like '%中文%' 指令是錯的,正確的語法是 Like N'%中文%'
另外 cs_SearchBarrel 我也研究完了,明後天再把心得寫一寫,cs_SearchBarrel對於中文還是有用,不需要程式大改
By Anonymous, at 6/15/2006 12:17 am
您是對的,CS中的標題與內文都是用nvarchar,因此在T-SQL使用N'...'才夠嚴謹。剛剛實地驗證了一下,在我的環境中(英文Win2003+英文SQL2000),不管有沒有加N都可以查出結果,但如果有用到非Big5的字,那麼這個寫法肯定要出錯的。
SearchBarrel算Hash的作法也可以適用於中文嗎? 真是大消息! 期待您的大作發表!
By Darkthread, at 6/16/2006 10:58 am
我把我改的心得寫在 http://www.ruri.com.tw/cs/blogs/archive/2006/06/24/279.aspx
歡迎提供意見
By Anonymous, at 6/24/2006 5:43 pm
Post a Comment
<< Home