SQL Server 全文搜索功能、全文索引方式介紹
SQL Server 的全文搜索(Full-Text Search)是基于分詞的文本檢索功能,依賴于全文索引。全文索引不同于傳統(tǒng)的平衡樹(B-Tree)索引和列存儲(chǔ)索引,它是由數(shù)據(jù)表構(gòu)成的,稱作倒轉(zhuǎn)索引(Invert Index),存儲(chǔ)分詞和行的唯一鍵的映射關(guān)系。...
SQL Server 的全文搜索(Full-Text Search)是基于分詞的文本檢索功能,依賴于全文索引。全文索引不同于傳統(tǒng)的平衡樹(B-Tree)索引和列存儲(chǔ)索引,它是由數(shù)據(jù)表構(gòu)成的,稱作倒轉(zhuǎn)索引(Invert Index),存儲(chǔ)分詞和行的唯一鍵的映射關(guān)系。倒轉(zhuǎn)索引是在創(chuàng)建全文索引或更新全文索引時(shí),由SQL Server自動(dòng)創(chuàng)建和維護(hù)的。
全文索引主要包含三種分析器:分詞器(word Breaker)、詞干分析器(stemmer)和同義詞分析器。全文索引中存儲(chǔ)的數(shù)據(jù)是分詞及其位置等信息,分詞是基于特定語言的語法規(guī)則,按照特定的符號(hào)尋找詞語的邊界,把文本分解為“單詞”,每一個(gè)單詞叫做一個(gè)分詞(term);全文索引有時(shí)會(huì)提取分詞的詞干,把詞干的多種派生形式存儲(chǔ)為單一詞干,這個(gè)過程叫做提取詞干;根據(jù)用戶提供的自定義同義詞列表,把相關(guān)的單詞轉(zhuǎn)換為同義詞,這個(gè)過程叫做提取同義詞。
生成全文索引是把用戶表中的文本數(shù)據(jù)進(jìn)行分詞(Word breaker)和提取詞干(Stemmer),并轉(zhuǎn)換同義詞(Thesaurus),過濾掉分詞中的停用詞(Stopword),最后把處理之后的數(shù)據(jù)存儲(chǔ)到全文索引中。把數(shù)據(jù)存儲(chǔ)到全文數(shù)據(jù)的過程叫做填充(Populate)或爬蟲(Crawl)進(jìn)程,全文索引的更新方式可以手動(dòng)填充,自動(dòng)填充,或增量填充。
一、創(chuàng)建全文目錄和唯一索引
創(chuàng)建全文索引之前,必須創(chuàng)建全文目錄(Full-Text Catalog),全文目錄用于組織全文索引,是全文索引的容器。每一個(gè)全文索引必須屬于一個(gè)全文目錄。全文目錄是個(gè)邏輯結(jié)構(gòu),跟數(shù)據(jù)庫的架構(gòu)(Schema)相同,根據(jù)全文索引的存儲(chǔ)位置無關(guān)。?
create
fulltext catalog catalog_test
as
default
;
為了創(chuàng)建全文索引,基礎(chǔ)表上必須存在一個(gè)唯一的(unique)、單列的(single-column)、非空的(non-nullable)的索引,全文引擎使用該索引把基礎(chǔ)表上的每行數(shù)據(jù)映射唯一索引鍵上,倒轉(zhuǎn)索引存儲(chǔ)的就是該索引鍵和分詞之間的映射關(guān)系。?
create
unique
index
uidx_dbLogID
on
[dbo].[DatabaseLog]
([DatabaseLogID]);
二、創(chuàng)建全文索引
每個(gè)表只能創(chuàng)建一個(gè)全文索引,創(chuàng)建全文索引時(shí),必須考慮全文索引存儲(chǔ)的文件組,全文索引關(guān)聯(lián)的停用詞列表,全文索引的更新方式,以及跟文本關(guān)聯(lián)的語言,全文索引列必須是文本字段,例如:?
create
fulltext
index
on
[dbo].[DatabaseLog]
(
[tsql] language 1033
)
key
index
ui_dbLogID
on
(catalog_test,filegroup [
primary
])
with
(change_tracking=
off
,
no
population ,stoplist=system);
1、語言(language)
選項(xiàng) language 是可選的,用于指定列級(jí)別的語言,該選項(xiàng)的值可以是語言的名稱或LCID,如果沒有指定language選項(xiàng),那么使用SQL Server實(shí)例的默認(rèn)語言。從系統(tǒng)視圖 sys.fulltext_languages (Transact-SQL)中查看系統(tǒng)支持的語言及其對(duì)應(yīng)的LCID 和名稱。
2、全文目錄(fulltext_catalog)
選項(xiàng)fulltext_catalog_name 用于指定全文索引的分組,
3、文件組(filegroup)
選項(xiàng) filegroup filegroup_name 用于指定全文索引存儲(chǔ)的文件組,如果沒有指定文件組,那么全文索引和基礎(chǔ)表存儲(chǔ)在相同的文件組中。由于更新全文索引是IO密集型操作,因此,為了更快的更新全文索引,最好把全文索引存儲(chǔ)在不同于基礎(chǔ)表的的物理硬盤或文件組上,以達(dá)到最大的IO并發(fā)。
4、填充全文索引的方式
和普通的索引相同,當(dāng)基礎(chǔ)表數(shù)據(jù)更新時(shí),全文索引必須自動(dòng)更新,這是系統(tǒng)默認(rèn)的行為,也可以配置手動(dòng)更新全文索引,或者間隔特定的時(shí)間點(diǎn)自動(dòng)更新全文索引。
選項(xiàng)CHANGE_TRACKING 用于指定跟全文索引列相關(guān)的數(shù)據(jù)更新(Update,Delete,或Insert)是否需要同步到全文索引,
•CHANGE_TRACKING = MANUAL :手動(dòng)更新
•CHANGE_TRACKING =AUTO:自動(dòng)更新,默認(rèn)設(shè)置,當(dāng)基礎(chǔ)表數(shù)據(jù)變化時(shí),全文索引自動(dòng)更新,
•CHANGE_TRACKING =OFF , NO POPULATION:不更新,指定選項(xiàng)NO POPULATION,表明在創(chuàng)建全文索引之后,SQL Server不會(huì)更新(populate)全文索引;如果未指定選項(xiàng)NO POPULATION,在創(chuàng)建全文索引之后,SQL Server更新全文索引。
5、停用詞(STOPLIST)
停用詞(StopWord)也稱作噪音詞,每一個(gè)全文索引都會(huì)關(guān)聯(lián)一個(gè)停用詞列表,默認(rèn)情況下,全文索引關(guān)聯(lián)的是系統(tǒng)停用詞(system stoplist)。全文引擎把停用詞從分詞中刪除,使全文索引不會(huì)包含停用詞。?
STOPLIST [ = ] {
OFF
| SYSTEM | stoplist_name }
三、填充全文索引
填充全文索引也叫做爬蟲(crawl)進(jìn)程,或填充(Population)進(jìn)程。由于創(chuàng)建或填充全文索引會(huì)消耗大量的系統(tǒng)(IO、內(nèi)存)資源,因此盡量選擇在系統(tǒng)空閑時(shí)對(duì)全文索引進(jìn)行填充。在創(chuàng)建全文索引時(shí),通過指定選項(xiàng) CHANGE_TRACKING= MANUAL,或 CHANGE_TRACKING= OFF, NO POPULATION,新建的全文索引不會(huì)立即填充,用戶可以選擇在系統(tǒng)空閑時(shí),使用 alter fulltext index 語句執(zhí)行填充操作。只有填充全文索引之后,全文索引才包含基礎(chǔ)表的分詞數(shù)據(jù)。?
alter
fulltext
index
on
table_name
start {
full
| incremental |
update
} population;
更新全文索引有三種方式:
1、FULL POPULATION:全部填充,從基礎(chǔ)表中獲取每一行,重新編入全文索引;
2、INCREMENTAL POPULATION:增量填充,前提是基礎(chǔ)表中包含timestamp字段,從上一次填充之后,只把更新之后的數(shù)據(jù)編入全文索引;
3、UPDATE POPULATION:更新填充,從上一次填充之后執(zhí)行更新(insert、update、或delete)操作的數(shù)據(jù)行重新編入索引;
在創(chuàng)建全文索引時(shí),如果指定CHANGE_TRACKING=AUTO 或 CHANGE_TRACKING= OFF , 那么新建的全文索引會(huì)立即開始填充進(jìn)程。
四、使用 contains 謂詞查詢?nèi)乃饕?/strong>
如果想要在查詢中使用全文索引,通常使用CONTAINS謂詞來調(diào)用全文索引,實(shí)現(xiàn)比LIKE關(guān)鍵字更復(fù)雜的文本匹配查詢,而LIKE關(guān)鍵字是模糊匹配,不會(huì)調(diào)用全文索引。
例如,利用contains謂詞執(zhí)行單個(gè)分詞的完全匹配查詢:?
select
[tsql]
from
[dbo].[DatabaseLog]
where
contains
([tsql],
'searchword'
, language 1033);
全文查詢跟Like相比,速度更快,支持的搜索功能更復(fù)雜,使用contains謂詞,不僅能夠執(zhí)行分詞的完全匹配或分詞的前綴匹配查詢,還能夠執(zhí)行基于詞根的查詢,基于自定義同義詞的查詢,基于距離和順序的相鄰分詞查詢。但是,和Like 相比,contains謂詞不能進(jìn)行后綴匹配查詢。
contains謂詞返回的結(jié)果是布爾值,如果全文索引列中包含指定的關(guān)鍵字或查找模式(pattern),返回TRUE;否則,返回FALSE。
contains謂詞支持word查詢和短語查詢,word是指單個(gè)分詞,短語(phrase)是由多個(gè)word和間隔的空格組成的,對(duì)于短語,必須使用雙引號(hào),將多個(gè)word組成一個(gè)短語。
1、邏輯組合查詢
使用and ,and not, 或 or 邏輯運(yùn)算符 匹配多個(gè)word 或 多個(gè)phrase?
CONTAINS
(
Name
,
'"Mountain" OR "Road" '
)
CONTAINS
(
Name
,
' Mountain OR Road '
)
2、前綴查詢
使用contains謂詞進(jìn)行前綴匹配,和like 'prefix%'功能相同,只不過contains謂詞使用“*”作為通配符,“*”匹配0,1或多個(gè)字符,前綴匹配的寫法是:'"prefix*"',全文索引只能執(zhí)行前綴匹配。?
CONTAINS
(
Name
,
' "Chain*" '
)
CONTAINS
(
Name
,
'"chain*" OR "full*"'
)
3,查詢同義詞(thesaurus)或詞干(stemmer)
Stemmer(詞干),例如,根據(jù)語法規(guī)程,英語的動(dòng)詞 根據(jù)數(shù)(單數(shù),復(fù)數(shù)),人稱,時(shí)態(tài)的不同而存在不同的變化形式,這些單詞都是同源的。?
CONTAINS
(Description,
' FORMSOF (INFLECTIONAL, ride) '
)
THESAURUS (同義詞),需要導(dǎo)入XML進(jìn)行配置,SQL Server 提供一個(gè)默認(rèn)的Thesaurus file,是Empty的。如果在Thesaurus file 配置“Author”,“Writer”,“journalist” 是同義詞,在使用fulltext index查詢時(shí),只要滿足任意一個(gè)同義詞,都匹配成功。?
CONTAINS
(Description,
' FORMSOF (THESAURUS, author) '
)
4、距離查詢
使用 near 函數(shù),查詢匹配相鄰分詞的數(shù)據(jù)行,near函數(shù)的定義如下,用于需要在查詢模式中指定距離查詢的查詢模式:?
NEAR ( ( { <simple_term> | <prefix_term> } [ ,…n ] ) [, <maximum_distance> ] [, <match_order> ] )
例如:使用Near 函數(shù)指定相鄰分詞的距離和匹配順序,near((term1,term2,term3),5)表示任意兩個(gè)term之間的距離不能超過5, near((term1,term2,term3),5,true),表示任意兩個(gè)term的距離不能超過5,并且按照 term1,term2,term3的順序存在于字符串中。?
--regardless of the intervening distance and regardless of order
CONTAINS
(column_name,
'NEAR(term1,"term3 term4")'
)
--searches for "AA" and "BB", in either order, within a maximum distance of five
CONTAINS
(column_name,
'NEAR((AA,BB),5)'
)
--in the specified order with regardless of the distance
CONTAINS
(column_name,
'NEAR ((Monday, Tuesday, Wednesday), MAX, TRUE)'
)
對(duì)于 near((term1,term2,term3),5,true),term1 和 term5之間最多存在5個(gè)term,不包括內(nèi)部的搜索分詞,“term2”,例如:?
CONTAINS
(column_name,
'NEAR((AA,BB,CC),5)'
)
這個(gè)查詢會(huì)匹配下面的文本,注意,內(nèi)部的搜索分詞CC沒有計(jì)算距離:?
BB one two CC three four five AA
例如,在原文本中,分詞bike和control的最大距離不能超過10,分詞bike必須出現(xiàn)在分詞control的前面:?
CONTAINS
(Comments ,
'NEAR((bike,control), 10, TRUE)'
)
SQL Server提供的全文搜索功能,比LIKE關(guān)鍵字豐富,具備初級(jí)的全文搜索功能,速度快,維護(hù)簡單,缺點(diǎn)是,全文搜索功能非常有限,在實(shí)際的開發(fā)中,可以配合開源的全文搜索引擎,例如,Solr,Elasticsearch等來開發(fā)功能更強(qiáng)大的全文搜索功能。
總結(jié)
以上所述是小編給大家介紹的SQL Server 全文搜索功能介紹,希望對(duì)大家有所幫助。
- 關(guān)于SQL Serve數(shù)據(jù)庫r帳號(hào)被禁用的處理方法
- SQL數(shù)據(jù)庫查詢優(yōu)化技巧提升網(wǎng)站訪問速度的方法
- SQL數(shù)據(jù)庫開發(fā)中的SSIS 延遲驗(yàn)證方法
- SQL Server數(shù)據(jù)庫建立新用戶及關(guān)聯(lián)數(shù)據(jù)庫的方法教程
- 蘋果公布2019第一財(cái)季財(cái)報(bào):iPhone表現(xiàn)不好 其他業(yè)務(wù)增
- 12306對(duì)第三方搶票軟件實(shí)施限制 平臺(tái):可正常搶票 未受
- 蘋果手機(jī)怎么隱藏照片?蘋果iPhone XR/XS Max隱藏照片方
- 蘋果iPhone XR朗讀屏幕功能怎么用?蘋果手機(jī)文字轉(zhuǎn)語音
- 王者榮耀王昭君中單怎么出裝?S14賽季王昭君中單出裝推
- 英雄聯(lián)盟S9雙修流探險(xiǎn)家-伊澤瑞爾符文出裝攻略
關(guān)于SQL Serve數(shù)據(jù)庫r帳號(hào)被禁用的處理方法
若發(fā)現(xiàn)SQL Serve所有帳號(hào)不小心被禁用了,這個(gè)時(shí)候怎么辦?用重裝嗎?不用,仔細(xì)看小白是怎么一步一步解開這個(gè)謎題的。首先需要Windows帳號(hào)設(shè)置里重新添加一個(gè)新帳號(hào)。并將其添加到...
SQL數(shù)據(jù)庫查詢優(yōu)化技巧提升網(wǎng)站訪問速度的方法
在這篇文章中,我將介紹如何識(shí)別導(dǎo)致性能出現(xiàn)問題的查詢,如何找出它們的問題所在,以及快速修復(fù)這些問題和其他加快查詢速度的方法。 你一定知道,一個(gè)快速訪問的網(wǎng)站能讓用...
SQL數(shù)據(jù)庫開發(fā)中的SSIS 延遲驗(yàn)證方法
驗(yàn)證是一個(gè)事件,該事件在Package執(zhí)行時(shí),第一個(gè)被觸發(fā),驗(yàn)證能夠避免SSIS引擎執(zhí)行一個(gè)有異常的Package或Task。延遲驗(yàn)證(DelayValidation)是把驗(yàn)證操作延遲到Package真正運(yùn)行(run-ti...
SQL Server數(shù)據(jù)庫建立新用戶及關(guān)聯(lián)數(shù)據(jù)庫的方法教程
本文講的是SQLserver數(shù)據(jù)庫創(chuàng)建新用戶方法以及賦予此用戶特定權(quán)限的方法,非常的簡單實(shí)用,有需要的小伙伴可以參考下...
蘋果公布2019第一財(cái)季財(cái)報(bào):iPhone表現(xiàn)不好 其他業(yè)務(wù)增長積極
1月30日消息,蘋果公司今日公布2019財(cái)年第一財(cái)季(即2018自然年第四季度)業(yè)績。財(cái)報(bào)顯示,蘋果在第一財(cái)季收營收843.1億美元,高于分析師預(yù)期的839.7億美元,比去年同期的882.93億美元下滑5%。凈利潤為199.65億美元,比去年同期的200.65億美元下滑0.5%。...
12306對(duì)第三方搶票軟件實(shí)施限制 平臺(tái):可正常搶票 未受限制
1月27日,鐵路部門在接受央視采訪時(shí)表示,第三方搶票軟件已經(jīng)被實(shí)施限制措施,即使用戶花錢購買了加速服務(wù),購票的成功率也絕不會(huì)像各個(gè)搶票軟件顯示的一樣。...
蘋果手機(jī)怎么隱藏照片?蘋果iPhone XR/XS Max隱藏照片方法
蘋果手機(jī)怎么隱藏照片呢?如果不想讓別人看到手機(jī)里的照片或者圖片,可以將 iPhone手機(jī)中的照片進(jìn)行隱藏。下面小編分享一下蘋果手機(jī)iPhone XR/XS Max隱藏手機(jī)圖片方法。
iPhone XR怎么隱藏照片?蘋果XR/XS Max隱藏手機(jī)圖片方法...蘋果iPhone XR朗讀屏幕功能怎么用?蘋果手機(jī)文字轉(zhuǎn)語音方法教程
蘋果手機(jī)的朗讀屏幕功能具有自動(dòng)把文字轉(zhuǎn)成語音的功能,那么,蘋果手機(jī)朗讀屏幕功能怎么使用呢?下面小編就來介紹下蘋果iPhone XR手機(jī)朗讀屏幕功能的開啟和使用方法。...
王者榮耀王昭君中單怎么出裝?S14賽季王昭君中單出裝推薦
王者榮耀王昭君是個(gè)非常厲害的英雄,現(xiàn)在的王昭君是除了武則天之外的第一法師。我們就來了解一下王者榮耀S14賽季王昭君中單出裝推薦...
英雄聯(lián)盟S9雙修流探險(xiǎn)家-伊澤瑞爾符文出裝攻略
今天小編就為大家介紹雙修流EZ的具體玩法。下文主要通過英雄聯(lián)盟S9雙修流探險(xiǎn)家-伊澤瑞爾的英雄定位、符文出裝、技能加點(diǎn)等角度來進(jìn)行介紹。...