MSSQL系列之十五 全文索引

(前端理論爲摘抄)大家都知道LIKE查詢很慢,全文索引就是事先做好相關的索引,表示哪個主題詞可以在哪些記錄裏找到,甚至事先計算好,檢索時可以把相關度高的先列出來,這可以大大提高檢索的速度

打個比方,你有很多的小抽屜,每個抽屜裏面放一些雜物,假如你要找東西,最原始的方法就是一個個抽屜翻,這就是沒有索引的情況。

假如聰明一點,給抽屜編號(唯一鍵),把哪個號碼的抽屜有什麼東西記錄在紙上,找東西先看看這張紙,這就是普通索引,假如你要知道哪個抽屜有什麼,你可以在紙上迅速找到抽屜號碼(大家知道這是使用查找樹),然後得到相關的信息,這種情況普通索引是很快的;但是要找到一個特定的東西哪些抽屜有,你就要把整張紙遍歷一次,這就是LIKE查詢,假如你要找哪些抽屜同時有2種甚至更多種物品,LIKE就更加繁瑣了。假如一個表有上千萬的紀錄,大家可以想象查詢的代價。

可以換一個思路,另外找張紙,記錄一樣東西存在於哪些抽屜:

夾子:1,3,4,5,6,9,12...

錢幣:2,3,4,7,12...

藥丸:1,3,5,6...

這樣找到某樣東西或者某幾樣東西都很容易。

全文索引和普通的SQL索引有很多的區別:

普通 SQL 索引全文索引 存儲時受定義它們所在的數據庫的控制。存儲在文件系統中,但通過數據庫管理。 每個表允許有若干個普通索引。每個表只允許有一個全文索引。當對作爲其基礎的數據進行插入、更新或刪除時,它們自動更新。將數據添加到全文索引稱爲填充,全文索引可通過調度或特定請求來請求,也可以在添加新數據時自動發生。 不分組。在同一個數據庫內分組爲一個或多個全文目錄。使用 SQL Server 企業管理器、嚮導或 Transact-SQL 語句創建和除去。使用 SQL Server 企業管理器、嚮導或存儲過程創建、管理和除去。

--參考表QQblog(僅供參考)

Create table QQBlog(id char(10) Constraint PK_Id primary key,--注意:藍色爲關鍵字,Primary key爲主鍵約束;PK_ID爲主鍵約束名topic varchar(30)not null,--標題一般不允許空,所以設置不爲"空"QQcontent varchar(8000),--內容kind char(8)Constraint DF_Kind default '個人日誌',--原創、轉載,個人日誌begintime datetime Constraint DF_BeginTime default getdate(),--getdate():獲得當前日期和時間visitCount int,--訪問量replyCount int --回覆量)insert qqblog(topic,QQcontent,kind) values('白雪公主','在丹麥的一個小農村,裏面發生了一起感人的事件,一個青蛙','日誌')insert qqblog(id,topic,QQcontent,kind) values('blog07','軟件','安阿餓是NIIT有個人馬化騰,開發了一款軟件,會講故事,java c#,右微軟買了該軟件','日誌')insert qqblog(topic,QQcontent,kind) values('QQ之父','1998年,馬化騰和幾個同學成立了自己的軟件公司,當時公司很小,主營業務是爲其他公司做軟件外包.據馬化騰回憶說,當時跟他很熟的丁磊正在做郵箱系 統,之後也賣了很多版本,“我也做過郵件,也給尋呼臺做過互動系統,比如短信查郵件什麼的,即時通信是其中一個項目.”    做好了軟件系統,接下來就是銷售,“當時並不止我一家在做這種通信產品,有一次投標,爲了搶先,我甚至在產品成型前就先寫好了投標書.”結果當然是投標失敗,“但現在想想還真的是幸運,那個拿到項目的公司沒有再維護產品,只有我們的QQ被砸在手上,纔會持續做下去.”    連馬化騰自己都沒有想到,到了2000年的時候,隨便走進一個網吧,聊天工具QQ跳動的企鵝已經成了流行,“我沒想到那麼多人在網上爭着和認識不認識的人聊天,好多人爲此刻苦學習打字,真瘋狂.”','日誌')insert qqblog(topic,QQcontent,kind) values('QQ之父2',' “要說煎熬,我創業最煎熬的就是這段時間,我不喜歡這樣的拖延,那時候納斯達克已經快崩盤了.”     產品有人用,離公司上市還有一大段距離,無論如何,2000年的騰訊還是個小公司,而且它的駐地在深圳,“深圳沒有北京的海歸圈子,當時的風險投資也不懂,全靠高交會幫了忙.”馬化騰回憶說,看在國外的前輩ICQ的成功經驗上,盈科數碼和IDG投資了騰訊,“兩家一起進,壯着膽子.”    但馬化騰的融資過程並不順利,隨着互聯網冬天的臨近,IDG投資完之後一直忙着爲馬化騰的公司找下家,“找過搜狐、新浪,他們都沒看得上眼.”馬化騰記 得,當時任職搜狐的古永鏘和馮珏都到騰訊看過一眼,2001年春天,馬化騰自己又去新浪見了王志東和汪延,但後來都沒了消息.    最後進場的買家是傳媒集團MIH,而最令馬化騰心焦的一段創業經歷也自此開始,“我願意找更有實力的投資人,IDG也願意出售股權,但盈科不答應.”當時的盈科,小超人李澤楷的數碼港計劃如日中天,“他甚至還找過王晶這樣的導演來我們公司參觀,探討前景.”','日誌')insert qqblog(topic,QQcontent,kind) values('QQ之父3','“要說煎熬,我創業最煎熬的就是這段時間,我不喜歡這樣的拖延,可當時盈科不說買也不說賣,把我們晾在一邊,等到最後終於定下來出售已經是2001年6月,那時候納斯達克已經快崩盤了.”    資本市場的幸運與否也許真的很難判斷,到了2008年6月,因爲股價增長強勁和穩定,騰訊成爲恆生指數的成分股,它頂替的正是盈科.馬化騰 王志東和汪延  受惠母親一本清晰的財務賬“她很負責任地幫我整理財務報表,後來公司搬家,搬那些桌椅板凳都是家裏人幫忙,因爲公司要減輕負擔.”    現在看起來,馬化騰的創業途徑很符合年輕人對所謂“知識英雄”的想象,寫代碼出身,幾個同學合夥創業,一起加班喫盒飯,熬夜改產品,憑藉創意和勤奮取得成功,慢慢地公司上市,簡陋的辦公室換成宏偉的大樓,創始人進入富豪榜.    但實際的情形要艱苦得多,以至於馬化騰需要給自己最感謝的人列一個長長的名單,“要感謝家裏人,最開始我媽不同意,我爸挺支持我的,可最早的董事長卻是我母親.”馬化騰回憶說,一開始,幾個年輕人是拿着母親的退休證去註冊的公司,但這位法人母親幾乎都沒來過公司,“可是她很負責任地幫我整理財務報表,後來 公司搬家,搬那些桌椅板凳都是家裏人幫忙,因爲公司要減輕負擔.”馬化騰的感謝名單裏還有當時深圳電腦協會的祕書長“丁阿姨”,還有現在深圳電信局的一個朋友,“是他們幫我們找了辦公場地,免我們的租金,聯繫託管服務器,現在看好像這些事情很小,但沒有這些,當時真不敢往下走.”    也許是對創業過程中這些幫助難以忘卻,馬化騰在招聘時定下一個標準——“人品好”,“我幾乎是有點偏執地超級強調這一點,我們幾個創始人都喜歡簡單,不喜歡搞政治化,哪怕你說我不懂也好,我就是強調簡單,人品第一,這樣的畢業生進入我的公司培養三年,我讓他成爲業務骨幹.”','日誌')Declare @i int --定義@i變量爲int型set @i=152792  --變量的初始化while @i<=1000000beginset @i=@i+1    --每次加1insert QQBlog(id,topic,QQcontent,kind) values('blog'+convert(char(7),@i),'QQ歷史','要說煎熬,我創業最煎熬的就是這段時間,我不喜歡這樣的拖延,可當時盈科不說買也不說賣,把我們晾在一邊,等到最後終於定下來出售已經是2001年6月,那時候納斯達克已經快崩盤了.”    資本市場的幸運與否也許真的很難判斷,到了2008年6月,因爲股價增長強勁和穩定,騰訊成爲恆生指數的成分股,它頂替的正是盈科.馬化騰 王志東和汪延  受惠母親一本清晰的財務賬“她很負責任地幫我整理財務報表,後來公司搬家,搬那些桌椅板凳都是家裏人幫忙,因爲公司要減輕負擔.”    現在看起來,馬化騰的創業途徑很符合年輕人對所謂“知識英雄”的想象,寫代碼出身,幾個同學合夥創業,一起加班喫盒飯,熬夜改產品,憑藉創意和勤奮取得成功,慢慢地公司上市,簡陋的辦公室換成宏偉的大樓,創始人進入富豪榜.    但實際的情形要艱苦得多,以至於馬化騰需要給自己最感謝的人列一個長長的名單,“要感謝家裏人,最開始我媽不同意,我爸挺支持我的,可最早的董事長卻是我母親.”馬化騰回憶說,一開始,幾個年輕人是拿着母親的退休證去註冊的公司,但這位法人母親幾乎都沒來過公司,“可是她很負責任地幫我整理財務報表,後來 公司搬家,搬那些桌椅板凳都是家裏人幫忙,因爲公司要減輕負擔.”馬化騰的感謝名單裏還有當時深圳電腦協會的祕書長“丁阿姨”,還有現在深圳電信局的一個朋友,“是他們幫我們找了辦公場地,免我們的租金,聯繫託管服務器,現在看好像這些事情很小,但沒有這些,當時真不敢往下走.”    也許是對創業過程中這些幫助難以忘卻,馬化騰在招聘時定下一個標準——“人品好”,“我幾乎是有點偏執地超級強調這一點,我們幾個創始人都喜歡簡單,不喜歡搞政治化,哪怕你說我不懂也好,我就是強調簡單,人品第一,這樣的畢業生進入我的公司培養三年,我讓他成爲業務骨幹.”','日誌')endselect * from qqblogsp_fulltext_database enable   --1.激活數據使能全文索引gocreate fulltext catalog cat1 as default  --2.建立全文目錄:建好在FTData下面.指定該目錄爲默認目錄create fulltext index on QQBlog(QQcontent) key index PK_Id  --3.建立全文索引 on cat1 with  NO POPULATION ,創建之後不填充--alter fulltext index on QQBlog start full population--4.起用填充--只有在用戶使用 START FULL、INCREMENTAL 或 UPDATE POPULATION 子句執行 ALTER FULLTEXT INDEX 命令後,纔會填充索引。--開始/增長/更新--5.使用全文索引--在qqblog表中查找包含馬化騰或盈科  的所有記錄select * from qqblog where qqContent like '%馬化騰%' or qqContent like '%盈科%' --51秒select count(*) from qqblog --161012select * from qqblog where freetext(QQcontent,'馬化騰 在 王志東')--freetext(列名,'要查找內容')--23秒--161010--馬化騰 王志東 是馬化騰或王志東select * from qqblog where contains(QQContent,'"馬化騰" or "王志東"')--161007--contains:"馬化騰 王志東",這是一個短語--有點區別???select * from qqblog where QQContent like '%馬化騰%'--要注意查找的時候不要包含噪音詞:在FTData下面的noise...文件下/*記錄的比較凌亂,請大家原諒,希望能從中找到適合自己的東東*/-- contains謂詞主要是針對單字或句子做查詢。-- freetext謂詞則會將指定的句子分解爲一個個的單字,然後查詢這些單字。----------------------------------contains-------------------------------------------搜尋書籍名稱字段中有 windows  computer print 這個單詞的記錄select * from 書籍 wherecontains(書籍名稱,'"windows or computer or print"')select * from 書籍 where contains(書籍名稱,'"windows"')--搜尋書籍字段中包含短語的記錄select * from 書籍 where contains(書籍名稱,'"a computer failure"')--例:this is a computer,failure to work 此句子也將被搜尋出來。--帶有通配符的查詢select * from 書籍 where contains(書籍名稱,'"sea*" OR "bread*"')--下面的示例返回包含短語 "sasquatch ale" 或 "steeleye stout" 的所有產品。use northwindgoselect productnamefrom productswhere contains(productname, ' "sasquatch ale" or "steeleye stout" ')go--------------------------------freetext----------------------------select * from 書籍 where freetext(地址,' "I like windows 2000 and photoshop 5" ')select * from 書籍 where freetext(地址,' "北京市大興區林校北路" ')-- a. 使用 freetext 搜索包含指定字符值的單詞--    下例搜索產品描述中含有與 sweetest bread、candy、dry 和 meat 相關的詞語的--    所有產品類別,如 breads、candies、dried 和 meats 等。use northwindgoselect categorynamefrom categorieswhere freetext (description, 'sweetest candy bread and dry meat' )go--b. 在全文檢索中使用變量--   下例使用變量而不是特定的搜索術語。use pubsgodeclare @searchword varchar(30)set @searchword ='moon'select pr_info from pub_info where freetext(pr_info, @searchword)

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章