基於MS SQLServer的全表搜索


最近在做項目的時候遇到一個問題,就是在查找記錄的時候輸入關鍵字找出滿足條件的記錄。一開始是每一個字段一個關鍵字,后面感覺有的查找的時候會涉及到6個甚至更多的字段,感覺在查找的時候相當困難。網上找了很久,想找到一種能夠不需要指定字段就可以全表搜索的方法,可惜一直沒找到,最后找到一個折中的辦法:在每一個表中定義一個字段,這個字段存儲其他所有字段的和,然后查找的時候就只要匹配這個字段就行了。

下面是實現思路:

因為在每條數據插入和修改的時候需要往這個字段中插入值或者是更新這個字段,而如果靠代碼來控制的話會非常麻煩:你必須時時刻刻記得在哪里插入數據了,又在哪里修改了數據。最后想到了觸發器,直接在數據庫中建立一個觸發器。

觸發器語句如下:

Create trigger [GECOAssets_Trigger]
on [dbo].[GECOAssets] for
insert,update
as
Update GECOAssets Set
SumText=isnull(SourceID,'') +'∩'+isnull(SourceName,'')+'∩'+isnull(StateNow,'')+'∩'+isnull(BuyDepartment,'')+'∩'+isnull(Factory,'')
+'∩'+isnull(SourceType,'')+'∩'+isnull(BackInfo,'')

這樣原本以為已經大功告成了,最后測試的時候發現,只要插入一條數據,或者表中的某個字段的值發生改變,所有的SumText的值都會被重新更新或者插入,當數據量很大的時候或者數據更新插入很頻繁的時候,勢必給數據庫造成很大的壓力。

這時我突然想起了當初學Orace的時候老師講過的行級觸發器,於是百度、谷歌找了很久,最后得出的結論是:MS SQLServer不支持行級觸發器。這下讓我很受打擊啊,畢竟自己覺得還不錯的方法就這樣被終結了,心情極度郁悶。不過,不拋棄不放棄是我的座右銘,於是死磕繼續百度、谷歌,最后發現,在插入和更新數據的時候,會有一個表叫做inserted,而這個表會存儲你更新時候的數據,這樣,我靈光一閃:那這個表中肯定就會存儲這條記錄的ID值,只要能取到ID的值,想必就可以指定更新某一條記錄了,也就可以實現行級觸發器的效果了,我抱着試試看的心態把觸發器改成了如下:

Alter trigger [GECOAssets_Trigger]
on [dbo].[GECOAssets] for 
insert,update
as
Update GECOAssets Set
SumText=isnull(SourceID,'') +'∩'+isnull(SourceName,'')+'∩'+isnull(StateNow,'')+'∩'+isnull(BuyDepartment,'')+'∩'+isnull(Factory,'')
+'∩'+isnull(SourceType,'')+'∩'+isnull(BackInfo,'') where ID in (select ID from inserted) 

果不其然,完美地實現了行級觸發器的效果,至此就可以全表不指定字段(當然還是需要指定SumText字段的)搜索了,感覺雖然不是什么完美的解決方案,但是畢竟還是比較理想的實現了想要的效果。不知道各位有沒有更好的解決辦法,或者說有沒有第三方的組件來實現全表關鍵字搜索或者更牛的多表聯合關鍵字搜索呢?

如果有的話,各位不要吝嗇哦,小弟這廂有禮了...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM