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原始碼修改的朋友,可以到這裡下載。
歡迎推文分享:
Published 15 April 2006 12:30 AM 由 Jeffrey
Filed under:
Views: 17,471



意見

# 小熊子 said on 15 April, 2006 06:05 PM

只有一句話…

太。強。了。

佩服佩服

# dmwc said on 12 June, 2006 05:47 PM

我有修改過那些Code,但還是沒辦法正確搜尋

可否將您的DLL檔借我測試

# Darkthread said on 13 June, 2006 11:05 AM

To dmwc,
呃... 由於後來又陸續針對我的需求,改了數個地方(我加上了AD整合式認證),可能直接引用DLL會有些困難。
有試過我附上可下載的兩個cs嗎? 我建議用SQL Profiler監看一下改版後送出的T-SQL指令,看看是否修改有生效。或是將問題細節再說明一下,我看看可否幫上忙。
Jeffrey

# dmwc said on 15 June, 2006 12:17 AM

我不曉得是不是環境的差異,我在MSDE + CWin2003 和 SQL2005(E) + EWin2003 情況下,都是跑出不正確的結果,不然就是您只有開Blog,但我是全部服務都開

在經過我半天的測試,後來有找到一個致命的Bug,修正那個Bug後,就正常了

如: <A HREF="http://www.ruri.com.tw/cs" REL="nofollow"/>

Bug 說一下,搜尋 Like '%中文%' 指令是錯的,正確的語法是 Like N'%中文%'

另外 cs_SearchBarrel 我也研究完了,明後天再把心得寫一寫,cs_SearchBarrel對於中文還是有用,不需要程式大改

# Darkthread said on 16 June, 2006 10:58 AM

您是對的,CS中的標題與內文都是用nvarchar,因此在T-SQL使用N'...'才夠嚴謹。剛剛實地驗證了一下,在我的環境中(英文Win2003+英文SQL2000),不管有沒有加N都可以查出結果,但如果有用到非Big5的字,那麼這個寫法肯定要出錯的。
SearchBarrel算Hash的作法也可以適用於中文嗎? 真是大消息! 期待您的大作發表!

# dmwc said on 24 June, 2006 05:43 PM

我把我改的心得寫在 <A HREF="http://www.ruri.com.tw/cs/blogs/archive/2006/06/24/279.aspx" REL="nofollow">http://www.ruri.com.tw/cs/blogs/archive/2006/06/24/279.aspx</A>

歡迎提供意見

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<April 2006>
SunMonTueWedThuFriSat
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456
 
RSS
創用 CC 授權條款
【廣告】
twMVC
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication