這期內容當中小編將會給大家?guī)碛嘘PSQL Server中怎么實現(xiàn)全文搜索功能,文章內容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
為溆浦等地區(qū)用戶提供了全套網頁設計制作服務,及溆浦網站建設行業(yè)解決方案。主營業(yè)務為成都網站制作、成都網站設計、外貿營銷網站建設、溆浦網站設計,以傳統(tǒng)方式定制建設網站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
一,創(chuàng)建全文目錄和唯一索引
創(chuàng)建全文索引之前,必須創(chuàng)建全文目錄(Full-Text Catalog),全文目錄用于組織全文索引,是全文索引的容器。每一個全文索引必須屬于一個全文目錄。全文目錄是個邏輯結構,跟數(shù)據(jù)庫的架構(Schema)相同,根據(jù)全文索引的存儲位置無關。
create fulltext catalog catalog_testas default;
為了創(chuàng)建全文索引,基礎表上必須存在一個唯一的(unique)、單列的(single-column)、非空的(non-nullable)的索引,全文引擎使用該索引把基礎表上的每行數(shù)據(jù)映射唯一索引鍵上,倒轉索引存儲的就是該索引鍵和分詞之間的映射關系。
create unique index uidx_dbLogID on [dbo].[DatabaseLog]([DatabaseLogID]);
二,創(chuàng)建全文索引
每個表只能創(chuàng)建一個全文索引,創(chuàng)建全文索引時,必須考慮全文索引存儲的文件組,全文索引關聯(lián)的停用詞列表,全文索引的更新方式,以及跟文本關聯(lián)的語言,全文索引列必須是文本字段,例如:
create fulltext index on [dbo].[DatabaseLog]([tsql] language 1033)key index ui_dbLogIDon (catalog_test,filegroup [primary]) with(change_tracking=off ,no population ,stoplist=system);
1,語言(language)
選項 language 是可選的,用于指定列級別的語言,該選項的值可以是語言的名稱或LCID,如果沒有指定language選項,那么使用SQL Server實例的默認語言。從系統(tǒng)視圖 sys.fulltext_languages (Transact-SQL)中查看系統(tǒng)支持的語言及其對應的LCID 和名稱。
2,全文目錄(fulltext_catalog)
選項fulltext_catalog_name 用于指定全文索引的分組,
3,文件組(filegroup)
選項 filegroup filegroup_name 用于指定全文索引存儲的文件組,如果沒有指定文件組,那么全文索引和基礎表存儲在相同的文件組中。由于更新全文索引是IO密集型操作,因此,為了更快的更新全文索引,最好把全文索引存儲在不同于基礎表的的物理硬盤或文件組上,以達到最大的IO并發(fā)。
4,填充全文索引的方式
和普通的索引相同,當基礎表數(shù)據(jù)更新時,全文索引必須自動更新,這是系統(tǒng)默認的行為,也可以配置手動更新全文索引,或者間隔特定的時間點自動更新全文索引。
選項CHANGE_TRACKING 用于指定跟全文索引列相關的數(shù)據(jù)更新(Update,Delete,或Insert)是否需要同步到全文索引,?CHANGE_TRACKING = MANUAL :手動更新?CHANGE_TRACKING =AUTO:自動更新,默認設置,當基礎表數(shù)據(jù)變化時,全文索引自動更新,?CHANGE_TRACKING =OFF , NO POPULATION:不更新,指定選項NO POPULATION,表明在創(chuàng)建全文索引之后,SQL Server不會更新(populate)全文索引;如果未指定選項NO POPULATION,在創(chuàng)建全文索引之后,SQL Server更新全文索引。
5,停用詞(STOPLIST)
停用詞(StopWord)也稱作噪音詞,每一個全文索引都會關聯(lián)一個停用詞列表,默認情況下,全文索引關聯(lián)的是系統(tǒng)停用詞(system stoplist)。全文引擎把停用詞從分詞中刪除,使全文索引不會包含停用詞。
STOPLIST [ = ] { OFF | SYSTEM | stoplist_name }
三,填充全文索引
填充全文索引也叫做爬蟲(crawl)進程,或填充(Population)進程。由于創(chuàng)建或填充全文索引會消耗大量的系統(tǒng)(IO、內存)資源,因此盡量選擇在系統(tǒng)空閑時對全文索引進行填充。在創(chuàng)建全文索引時,通過指定選項 CHANGE_TRACKING= MANUAL,或 CHANGE_TRACKING= OFF, NO POPULATION,新建的全文索引不會立即填充,用戶可以選擇在系統(tǒng)空閑時,使用 alter fulltext index 語句執(zhí)行填充操作。只有填充全文索引之后,全文索引才包含基礎表的分詞數(shù)據(jù)。
alter fulltext index on table_namestart { full | incremental | update } population;
更新全文索引有三種方式:
?FULL POPULATION:全部填充,從基礎表中獲取每一行,重新編入全文索引;?INCREMENTAL POPULATION:增量填充,前提是基礎表中包含timestamp字段,從上一次填充之后,只把更新之后的數(shù)據(jù)編入全文索引;?UPDATE POPULATION:更新填充,從上一次填充之后執(zhí)行更新(insert、update、或delete)操作的數(shù)據(jù)行重新編入索引;
在創(chuàng)建全文索引時,如果指定CHANGE_TRACKING=AUTO 或 CHANGE_TRACKING= OFF , 那么新建的全文索引會立即開始填充進程。
四,使用 contains 謂詞查詢全文索引
如果想要在查詢中使用全文索引,通常使用CONTAINS謂詞來調用全文索引,實現(xiàn)比LIKE關鍵字更復雜的文本匹配查詢,而LIKE關鍵字是模糊匹配,不會調用全文索引。
例如,利用contains謂詞執(zhí)行單個分詞的完全匹配查詢:
select [tsql] from [dbo].[DatabaseLog] where contains([tsql], 'searchword', language 1033);
全文查詢跟Like相比,速度更快,支持的搜索功能更復雜,使用contains謂詞,不僅能夠執(zhí)行分詞的完全匹配或分詞的前綴匹配查詢,還能夠執(zhí)行基于詞根的查詢,基于自定義同義詞的查詢,基于距離和順序的相鄰分詞查詢。但是,和Like 相比,contains謂詞不能進行后綴匹配查詢。
contains謂詞返回的結果是布爾值,如果全文索引列中包含指定的關鍵字或查找模式(pattern),返回TRUE;否則,返回FALSE。
contains謂詞支持word查詢和短語查詢,word是指單個分詞,短語(phrase)是由多個word和間隔的空格組成的,對于短語,必須使用雙引號,將多個word組成一個短語。
1,邏輯組合查詢
使用and ,and not, 或 or 邏輯運算符 匹配多個word 或 多個phrase
CONTAINS(Name, '"Mountain" OR "Road" ')CONTAINS(Name, ' Mountain OR Road ')
2,前綴查詢
使用contains謂詞進行前綴匹配,和like 'prefix%'功能相同,只不過contains謂詞使用“*”作為通配符,“*”匹配0,1或多個字符,前綴匹配的寫法是:'"prefix*"',全文索引只能執(zhí)行前綴匹配。
CONTAINS(Name, ' "Chain*" ')CONTAINS(Name, '"chain*" OR "full*"')
3,查詢同義詞(thesaurus)或詞干(stemmer)
Stemmer(詞干),例如,根據(jù)語法規(guī)程,英語的動詞 根據(jù)數(shù)(單數(shù),復數(shù)),人稱,時態(tài)的不同而存在不同的變化形式,這些單詞都是同源的。
CONTAINS(Description, ' FORMSOF (INFLECTIONAL, ride) ')
THESAURUS (同義詞),需要導入XML進行配置,SQL Server 提供一個默認的Thesaurus file,是Empty的。如果在Thesaurus file 配置“Author”,“Writer”,“journalist” 是同義詞,在使用fulltext index查詢時,只要滿足任意一個同義詞,都匹配成功。
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)表示任意兩個term之間的距離不能超過5, near((term1,term2,term3),5,true),表示任意兩個term的距離不能超過5,并且按照 term1,term2,term3的順序存在于字符串中。
--regardless of the intervening distance and regardless of orderCONTAINS(column_name, 'NEAR(term1,"term3 term4")')--searches for "AA" and "BB", in either order, within a maximum distance of fiveCONTAINS(column_name, 'NEAR((AA,BB),5)')--in the specified order with regardless of the distanceCONTAINS(column_name, 'NEAR ((Monday, Tuesday, Wednesday), MAX, TRUE)')
對于 near((term1,term2,term3),5,true),term1 和 term5之間最多存在5個term,不包括內部的搜索分詞,“term2”,例如:
CONTAINS(column_name, 'NEAR((AA,BB,CC),5)')
這個查詢會匹配下面的文本,注意,內部的搜索分詞CC沒有計算距離:
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關鍵字豐富,具備初級的全文搜索功能,速度快,維護簡單,缺點是,全文搜索功能非常有限,在實際的開發(fā)中,可以配合開源的全文搜索引擎,例如,Solr,Elasticsearch等來開發(fā)功能更強大的全文搜索功能。
上述就是小編為大家分享的SQL Server中怎么實現(xiàn)全文搜索功能了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
新聞名稱:SQLServer中怎么實現(xiàn)全文搜索功能
網頁URL:http://jinyejixie.com/article4/iehsie.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供做網站、微信公眾號、網站制作、網站建設、網站設計、網站收錄
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)