久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

SQL Server中怎么實現全文搜索功能

154次閱讀
沒有評論

共計 4577 個字符,預計需要花費 12 分鐘才能閱讀完成。

這期內容當中丸趣 TV 小編將會給大家帶來有關 SQL Server 中怎么實現全文搜索功能,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

一,創建全文目錄和唯一索引

創建全文索引之前,必須創建全文目錄(Full-Text Catalog),全文目錄用于組織全文索引,是全文索引的容器。每一個全文索引必須屬于一個全文目錄。全文目錄是個邏輯結構,跟數據庫的架構(Schema)相同,根據全文索引的存儲位置無關。

create fulltext catalog catalog_testas default;

為了創建全文索引,基礎表上必須存在一個唯一的(unique)、單列的(single-column)、非空的(non-nullable)的索引,全文引擎使用該索引把基礎表上的每行數據映射唯一索引鍵上,倒轉索引存儲的就是該索引鍵和分詞之間的映射關系。

create unique index uidx_dbLogID on [dbo].[DatabaseLog]([DatabaseLogID]);

二,創建全文索引

每個表只能創建一個全文索引,創建全文索引時,必須考慮全文索引存儲的文件組,全文索引關聯的停用詞列表,全文索引的更新方式,以及跟文本關聯的語言,全文索引列必須是文本字段,例如:

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 實例的默認語言。從系統視圖 sys.fulltext_languages (Transact-SQL) 中查看系統支持的語言及其對應的 LCID 和名稱。

2,全文目錄(fulltext_catalog)

選項 fulltext_catalog_name 用于指定全文索引的分組,

3,文件組(filegroup)

選項 filegroup filegroup_name 用于指定全文索引存儲的文件組,如果沒有指定文件組,那么全文索引和基礎表存儲在相同的文件組中。由于更新全文索引是 IO 密集型操作,因此,為了更快的更新全文索引,最好把全文索引存儲在不同于基礎表的的物理硬盤或文件組上,以達到最大的 IO 并發。

4,填充全文索引的方式

和普通的索引相同,當基礎表數據更新時,全文索引必須自動更新,這是系統默認的行為,也可以配置手動更新全文索引,或者間隔特定的時間點自動更新全文索引。

選項 CHANGE_TRACKING 用于指定跟全文索引列相關的數據更新(Update,Delete,或 Insert)是否需要同步到全文索引,?CHANGE_TRACKING = MANUAL:手動更新?CHANGE_TRACKING =AUTO:自動更新,默認設置,當基礎表數據變化時,全文索引自動更新,?CHANGE_TRACKING =OFF , NO POPULATION:不更新,指定選項 NO POPULATION,表明在創建全文索引之后,SQL Server 不會更新(populate)全文索引;如果未指定選項 NO POPULATION,在創建全文索引之后,SQL Server 更新全文索引。

5,停用詞(STOPLIST)

停用詞(StopWord)也稱作噪音詞,每一個全文索引都會關聯一個停用詞列表,默認情況下,全文索引關聯的是系統停用詞(system stoplist)。全文引擎把停用詞從分詞中刪除,使全文索引不會包含停用詞。

STOPLIST [ = ] { OFF | SYSTEM | stoplist_name }

三,填充全文索引

填充全文索引也叫做爬蟲(crawl)進程,或填充(Population)進程。由于創建或填充全文索引會消耗大量的系統(IO、內存)資源,因此盡量選擇在系統空閑時對全文索引進行填充。在創建全文索引時,通過指定選項 CHANGE_TRACKING= MANUAL,或 CHANGE_TRACKING= OFF, NO POPULATION,新建的全文索引不會立即填充,用戶可以選擇在系統空閑時,使用 alter fulltext index 語句執行填充操作。只有填充全文索引之后,全文索引才包含基礎表的分詞數據。

alter fulltext index on table_namestart { full | incremental | update } population;

更新全文索引有三種方式:

?FULL POPULATION:全部填充,從基礎表中獲取每一行,重新編入全文索引;?INCREMENTAL POPULATION:增量填充,前提是基礎表中包含 timestamp 字段,從上一次填充之后,只把更新之后的數據編入全文索引;?UPDATE POPULATION:更新填充,從上一次填充之后執行更新(insert、update、或 delete)操作的數據行重新編入索引;

在創建全文索引時,如果指定 CHANGE_TRACKING=AUTO 或 CHANGE_TRACKING= OFF,那么新建的全文索引會立即開始填充進程。

四,使用 contains 謂詞查詢全文索引

如果想要在查詢中使用全文索引,通常使用 CONTAINS 謂詞來調用全文索引,實現比 LIKE 關鍵字更復雜的文本匹配查詢,而 LIKE 關鍵字是模糊匹配,不會調用全文索引。

例如,利用 contains 謂詞執行單個分詞的完全匹配查詢:

select [tsql] from [dbo].[DatabaseLog] where contains([tsql],  searchword , language 1033);

全文查詢跟 Like 相比,速度更快,支持的搜索功能更復雜,使用 contains 謂詞,不僅能夠執行分詞的完全匹配或分詞的前綴匹配查詢,還能夠執行基于詞根的查詢,基于自定義同義詞的查詢,基于距離和順序的相鄰分詞查詢。但是,和 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*,全文索引只能執行前綴匹配。

CONTAINS(Name,    Chain*  )CONTAINS(Name,  chain*  OR  full*)

3,查詢同義詞(thesaurus)或詞干(stemmer)

Stemmer(詞干),例如,根據語法規程,英語的動詞 根據數(單數,復數),人稱,時態的不同而存在不同的變化形式,這些單詞都是同源的。

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 函數,查詢匹配相鄰分詞的數據行,near 函數的定義如下,用于需要在查詢模式中指定距離查詢的查詢模式:

NEAR ( ( {  simple_term  |  prefix_term  } [ ,…n ] ) [,  maximum_distance  ] [,  match_order  ] )

例如:使用 Near 函數指定相鄰分詞的距離和匹配順序,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 必須出現在分詞 control 的前面:

CONTAINS(Comments ,  NEAR((bike,control), 10, TRUE) )

SQL Server 提供的全文搜索功能,比 LIKE 關鍵字豐富,具備初級的全文搜索功能,速度快,維護簡單,缺點是,全文搜索功能非常有限,在實際的開發中,可以配合開源的全文搜索引擎,例如,Solr,Elasticsearch 等來開發功能更強大的全文搜索功能。

上述就是丸趣 TV 小編為大家分享的 SQL Server 中怎么實現全文搜索功能了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注丸趣 TV 行業資訊頻道。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-03發表,共計4577字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 梨树县| 绥江县| 六安市| 大石桥市| 南郑县| 昌平区| 大宁县| 调兵山市| 阳泉市| 巴青县| 响水县| 定日县| 北流市| 万全县| 淮滨县| 威信县| 精河县| 泸溪县| 历史| 宿迁市| 高唐县| 罗甸县| 台东市| SHOW| 新巴尔虎右旗| 洪雅县| 乌兰县| 奉贤区| 嘉兴市| 垫江县| 桂阳县| 湘阴县| 新昌县| 门源| 吴桥县| 苏州市| 阜康市| 合水县| 罗甸县| 亳州市| 唐山市|