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

打個比方,你有很多的小抽屜,每個抽屜里面放一些雜物,假如你要找東西,最原始的方法就是一個個抽屜翻,這就是沒有索引的情況。
假如聰明一點,給抽屜編號(唯一鍵),把哪個號碼的抽屜有什么東西記錄在紙上,找東西先看看這張紙,這就是普通索引,假如你要知道哪個抽屜有什么,你可以在紙上迅速找到抽屜號碼(大家知道這是使用查找樹),然后得到相關的信息,這種情況普通索引是很快的;但是要找到一個特定的東西哪些抽屜有,你就要把整張紙遍歷一次,這就是LIKE查詢,假如你要找哪些抽屜同時有2種甚至更多種物品,LIKE就更加繁瑣了。假如一個表有上千萬的紀錄,大家可以想象查詢的代價。
可以換一個思路,另外找張紙,記錄一樣東西存在于哪些抽屜:
夾子:1,3,4,5,6,9,12...
錢幣:2,3,4,7,12...
藥丸:1,3,5,6...
這樣找到某樣東西或者某幾樣東西都很容易。
全文索引和普通的SQL索引有很多的區(qū)別:
普通 SQL 索引全文索引 存儲時受定義它們所在的數(shù)據(jù)庫的控制。存儲在文件系統(tǒng)中,但通過數(shù)據(jù)庫管理。 每個表允許有若干個普通索引。每個表只允許有一個全文索引。當對作為其基礎的數(shù)據(jù)進行插入、更新或刪除時,它們自動更新。將數(shù)據(jù)添加到全文索引稱為填充,全文索引可通過調(diào)度或特定請求來請求,也可以在添加新數(shù)據(jù)時自動發(fā)生。 不分組。在同一個數(shù)據(jù)庫內(nèi)分組為一個或多個全文目錄。使用 SQL Server 企業(yè)管理器、向?qū)Щ?Transact-SQL 語句創(chuàng)建和除去。使用 SQL Server 企業(yè)管理器、向?qū)Щ虼鎯^程創(chuàng)建、管理和除去。
--參考表QQblog(僅供參考)
Create table QQBlog
(
id char(10) Constraint PK_Id primary key,--注意:藍色為關鍵字,Primary key為主鍵約束;PK_ID為主鍵約束名
topic varchar(30)not null,--標題一般不允許空,所以設置不為"空"
QQcontent varchar(8000),--內(nèi)容
kind char(8)Constraint DF_Kind default '個人日志',--原創(chuàng)、轉(zhuǎn)載,個人日志
begintime datetime Constraint DF_BeginTime default getdate(),--getdate():獲得當前日期和時間
visitCount int,--訪問量
replyCount int --回復量
)
insert qqblog(topic,QQcontent,kind) values('白雪公主','在丹麥的一個小農(nóng)村,里面發(fā)生了一起感人的事件,一個青蛙','日志')
insert qqblog(id,topic,QQcontent,kind) values('blog07','軟件','安阿餓是NIIT有個人馬化騰,開發(fā)了一款軟件,會講故事,java c#,右微軟買了該軟件','日志')
insert qqblog(topic,QQcontent,kind) values('QQ之父','1998年,馬化騰和幾個同學成立了自己的軟件公司,當時公司很小,主營業(yè)務是為其他公司做軟件外包.據(jù)馬化騰回憶說,當時跟他很熟的丁磊正在做郵箱系 統(tǒng),之后也賣了很多版本,“我也做過郵件,也給尋呼臺做過互動系統(tǒng),比如短信查郵件什么的,即時通信是其中一個項目.”
做好了軟件系統(tǒng),接下來就是銷售,“當時并不止我一家在做這種通信產(chǎn)品,有一次投標,為了搶先,我甚至在產(chǎn)品成型前就先寫好了投標書.”結(jié)果當然是投標失敗,“但現(xiàn)在想想還真的是幸運,那個拿到項目的公司沒有再維護產(chǎn)品,只有我們的QQ被砸在手上,才會持續(xù)做下去.”
連馬化騰自己都沒有想到,到了2000年的時候,隨便走進一個網(wǎng)吧,聊天工具QQ跳動的企鵝已經(jīng)成了流行,“我沒想到那么多人在網(wǎng)上爭著和認識不認識的人聊天,好多人為此刻苦學習打字,真瘋狂.”
','日志')
insert qqblog(topic,QQcontent,kind) values('QQ之父2',' “要說煎熬,我創(chuàng)業(yè)最煎熬的就是這段時間,我不喜歡這樣的拖延,那時候納斯達克已經(jīng)快崩盤了.”
產(chǎn)品有人用,離公司上市還有一大段距離,無論如何,2000年的騰訊還是個小公司,而且它的駐地在深圳,“深圳沒有北京的海歸圈子,當時的風險投資也不懂,全靠高交會幫了忙.”馬化騰回憶說,看在國外的前輩ICQ的成功經(jīng)驗上,盈科數(shù)碼和IDG投資了騰訊,“兩家一起進,壯著膽子.”
但馬化騰的融資過程并不順利,隨著互聯(lián)網(wǎng)冬天的臨近,IDG投資完之后一直忙著為馬化騰的公司找下家,“找過搜狐、新浪,他們都沒看得上眼.”馬化騰記 得,當時任職搜狐的古永鏘和馮玨都到騰訊看過一眼,2001年春天,馬化騰自己又去新浪見了王志東和汪延,但后來都沒了消息.
最后進場的買家是傳媒集團MIH,而最令馬化騰心焦的一段創(chuàng)業(yè)經(jīng)歷也自此開始,“我愿意找更有實力的投資人,IDG也愿意出售股權(quán),但盈科不答應.”當時的盈科,小超人李澤楷的數(shù)碼港計劃如日中天,“他甚至還找過王晶這樣的導演來我們公司參觀,探討前景.”
','日志')
insert qqblog(topic,QQcontent,kind) values('QQ之父3','“要說煎熬,我創(chuàng)業(yè)最煎熬的就是這段時間,我不喜歡這樣的拖延,可當時盈科不說買也不說賣,把我們晾在一邊,等到最后終于定下來出售已經(jīng)是2001年6月,那時候納斯達克已經(jīng)快崩盤了.”
資本市場的幸運與否也許真的很難判斷,到了2008年6月,因為股價增長強勁和穩(wěn)定,騰訊成為恒生指數(shù)的成分股,它頂替的正是盈科.馬化騰 王志東和汪延
受惠母親一本清晰的財務賬“她很負責任地幫我整理財務報表,后來公司搬家,搬那些桌椅板凳都是家里人幫忙,因為公司要減輕負擔.”
現(xiàn)在看起來,馬化騰的創(chuàng)業(yè)途徑很符合年輕人對所謂“知識英雄”的想象,寫代碼出身,幾個同學合伙創(chuàng)業(yè),一起加班吃盒飯,熬夜改產(chǎn)品,憑借創(chuàng)意和勤奮取得成功,慢慢地公司上市,簡陋的辦公室換成宏偉的大樓,創(chuàng)始人進入富豪榜.
但實際的情形要艱苦得多,以至于馬化騰需要給自己最感謝的人列一個長長的名單,“要感謝家里人,最開始我媽不同意,我爸挺支持我的,可最早的董事長卻是我母親.”馬化騰回憶說,一開始,幾個年輕人是拿著母親的退休證去注冊的公司,但這位法人母親幾乎都沒來過公司,“可是她很負責任地幫我整理財務報表,后來 公司搬家,搬那些桌椅板凳都是家里人幫忙,因為公司要減輕負擔.”馬化騰的感謝名單里還有當時深圳電腦協(xié)會的秘書長“丁阿姨”,還有現(xiàn)在深圳電信局的一個朋友,“是他們幫我們找了辦公場地,免我們的租金,聯(lián)系托管服務器,現(xiàn)在看好像這些事情很小,但沒有這些,當時真不敢往下走.”
也許是對創(chuàng)業(yè)過程中這些幫助難以忘卻,馬化騰在招聘時定下一個標準——“人品好”,“我?guī)缀跏怯悬c偏執(zhí)地超級強調(diào)這一點,我們幾個創(chuàng)始人都喜歡簡單,不喜歡搞政治化,哪怕你說我不懂也好,我就是強調(diào)簡單,人品第一,這樣的畢業(yè)生進入我的公司培養(yǎng)三年,我讓他成為業(yè)務骨干.”
','日志')
Declare @i int --定義@i變量為int型
set @i=152792 --變量的初始化
while @i<=1000000
begin
set @i=@i+1 --每次加1
insert QQBlog(id,topic,QQcontent,kind) values('blog'+convert(char(7),@i),'QQ歷史','要說煎熬,我創(chuàng)業(yè)最煎熬的就是這段時間,我不喜歡這樣的拖延,可當時盈科不說買也不說賣,把我們晾在一邊,等到最后終于定下來出售已經(jīng)是2001年6月,那時候納斯達克已經(jīng)快崩盤了.”
資本市場的幸運與否也許真的很難判斷,到了2008年6月,因為股價增長強勁和穩(wěn)定,騰訊成為恒生指數(shù)的成分股,它頂替的正是盈科.馬化騰 王志東和汪延
受惠母親一本清晰的財務賬“她很負責任地幫我整理財務報表,后來公司搬家,搬那些桌椅板凳都是家里人幫忙,因為公司要減輕負擔.”
現(xiàn)在看起來,馬化騰的創(chuàng)業(yè)途徑很符合年輕人對所謂“知識英雄”的想象,寫代碼出身,幾個同學合伙創(chuàng)業(yè),一起加班吃盒飯,熬夜改產(chǎn)品,憑借創(chuàng)意和勤奮取得成功,慢慢地公司上市,簡陋的辦公室換成宏偉的大樓,創(chuàng)始人進入富豪榜.
但實際的情形要艱苦得多,以至于馬化騰需要給自己最感謝的人列一個長長的名單,“要感謝家里人,最開始我媽不同意,我爸挺支持我的,可最早的董事長卻是我母親.”馬化騰回憶說,一開始,幾個年輕人是拿著母親的退休證去注冊的公司,但這位法人母親幾乎都沒來過公司,“可是她很負責任地幫我整理財務報表,后來 公司搬家,搬那些桌椅板凳都是家里人幫忙,因為公司要減輕負擔.”馬化騰的感謝名單里還有當時深圳電腦協(xié)會的秘書長“丁阿姨”,還有現(xiàn)在深圳電信局的一個朋友,“是他們幫我們找了辦公場地,免我們的租金,聯(lián)系托管服務器,現(xiàn)在看好像這些事情很小,但沒有這些,當時真不敢往下走.”
也許是對創(chuàng)業(yè)過程中這些幫助難以忘卻,馬化騰在招聘時定下一個標準——“人品好”,“我?guī)缀跏怯悬c偏執(zhí)地超級強調(diào)這一點,我們幾個創(chuàng)始人都喜歡簡單,不喜歡搞政治化,哪怕你說我不懂也好,我就是強調(diào)簡單,人品第一,這樣的畢業(yè)生進入我的公司培養(yǎng)三年,我讓他成為業(yè)務骨干.”
','日志')
end
select * from qqblog
sp_fulltext_database enable --1.激活數(shù)據(jù)使能全文索引
go
create fulltext catalog cat1 as default --2.建立全文目錄:建好在FTData下面.指定該目錄為默認目錄
create fulltext index on QQBlog(QQcontent) key index PK_Id --3.建立全文索引 on cat1 with NO POPULATION ,創(chuàng)建之后不填充
--
alter fulltext index on QQBlog start full population--4.起用填充
--只有在用戶使用 START FULL、INCREMENTAL 或 UPDATE POPULATION 子句執(zhí)行 ALTER FULLTEXT INDEX 命令后,才會填充索引。
--開始/增長/更新
--5.使用全文索引
--在qqblog表中查找包含馬化騰或盈科 的所有記錄
select * from qqblog where qqContent like '%馬化騰%' or qqContent like '%盈科%' --51秒
select count(*) from qqblog --161012
select * from qqblog where freetext(QQcontent,'馬化騰 在 王志東')--freetext(列名,'要查找內(nèi)容')--23秒--161010
--馬化騰 王志東 是馬化騰或王志東
select * from qqblog where contains(QQContent,'"馬化騰" or "王志東"')--161007
--contains:"馬化騰 王志東",這是一個短語
--有點區(qū)別???
select * from qqblog where QQContent like '%馬化騰%'
--要注意查找的時候不要包含噪音詞:在FTData下面的noise...文件下
/*記錄的比較凌亂,請大家原諒,希望能從中找到適合自己的東東*/
-- contains謂詞主要是針對單字或句子做查詢。
-- freetext謂詞則會將指定的句子分解為一個個的單字,然后查詢這些單字。
----------------------------------contains-----------------------------------------
--搜尋書籍名稱字段中有 windows computer print 這個單詞的記錄
select * from 書籍 where
contains(書籍名稱,'"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" 的所有產(chǎn)品。
use northwind
go
select productname
from products
where contains(productname, ' "sasquatch ale" or "steeleye stout" ')
go
--------------------------------freetext----------------------------
select * from 書籍 where freetext(地址,' "I like windows 2000 and photoshop 5" ')
select * from 書籍 where freetext(地址,' "北京市大興區(qū)林校北路" ')
-- a. 使用 freetext 搜索包含指定字符值的單詞
-- 下例搜索產(chǎn)品描述中含有與 sweetest bread、candy、dry 和 meat 相關的詞語的
-- 所有產(chǎn)品類別,如 breads、candies、dried 和 meats 等。
use northwind
go
select categoryname
from categories
where freetext (description, 'sweetest candy bread and dry meat' )
go
--b. 在全文檢索中使用變量
-- 下例使用變量而不是特定的搜索術(shù)語。
use pubs
go
declare @searchword varchar(30)
set @searchword ='moon'
select pr_info from pub_info where freetext(pr_info, @searchword)
SQL
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。