全文索引
全文索引是基于要編制索引的文本中的各個標記來生成倒排序、堆積且壓縮的索引結構。每個表或索引視圖只允許有一個全文索引。該索引最多可包含 1024 列。,該對象中必須有一唯一并且非空的列。全文索引大小受運行SQL SERVER實例的計算機的可用內存資源限制。對全文索引的創建和維護過程 稱為 “索引填充”。索引填充分為:完全填充、基于時間戳的增量式填充、基于更改跟蹤的填充
--確定是否安裝了全文組件。如果已經安裝該服務,此語句返回 1,否則返回 0。SELECT FULLTEXTSERVICEPROPERTY('IsFullTextInstalled');--確定已分配給全文的資源使用級別 1(后臺)到 5(專用)SELECT FULLTEXTSERVICEPROPERTY ('ResourceUsage');
全文目錄
首先第一步:為數據庫創建全文目錄。一個全文目錄可以包含多個全文索引,但一個全文索引只能用于構成一個全文目錄。每個數據庫可以不包含全文目錄或包含多個全文目錄。例如 :create fulltext catalog my_full_catalog with accent_sensitivity =on as default;-- 可選項 with accent_sensitivity =on|off 指定該目錄的全文索引是否區分重音。在更改此屬性后,必須重新生成索引。默認情況下,將使用數據庫排序規則中所指定的區分重音設置。若要顯示數據庫排序規則,請使用 select * from sys.databases
第二步:創建索引(來自聯機幫助):CREATE FULLTEXT INDEX ON table_name[ ( { column_name [ TYPE COLUMN type_column_name ][ LANGUAGE language_term ] } [ ,...n] ) ]KEY INDEX index_name [ ON <catalog_filegroup_option> ][ WITH [ ( ] <with_option> [ ,...n] [ ) ] ]<catalog_filegroup_option>::={fulltext_catalog_name | ( fulltext_catalog_name, FILEGROUP filegroup_name )| ( FILEGROUP filegroup_name, fulltext_catalog_name )| ( FILEGROUP filegroup_name )}
<with_option>::={CHANGE_TRACKING [ = ] { MANUAL | AUTO | OFF [, NO POPULATION ] } | STOPLIST [ = ] { OFF | SYSTEM | stoplist_name }}注解:column_name 全文索引中包含的列的名稱。只能對類型為 char、varchar、nchar、nvarchar、text、ntext、image、xml 和 varbinary 的列進行全文索引若要指定多個列,請按如下方式重復 column_name 子句:CREATE FULLTEXT INDEX ON table_name (column_name1 […], column_name2 […]) …
TYPE COLUMN type_column_nametable_name 中列的名稱,用于存儲 column_name 的文檔類型。type_column_name 的類型必須為 char、nchar、varchar 或 nvarchar。僅當 column_name 中的一個或多個列屬于類型 varbinary(max) 或 image 時,才指定 type_column_name;
KEY INDEX index_nametable_name 的唯一鍵索引的名稱。KEY INDEX 必須是唯一的單鍵不可為 Null 的列。為全文唯一鍵選擇最小的唯一鍵索引。
fulltext_catalog_name 用于全文索引的全文目錄。數據庫中必須已存在該目錄。此子句為可選項。如果未指定,則使用默認目錄。
FILEGROUP filegroup_name針對指定的文件組創建指定的全文索引。該文件組必須已存在。如果未指定 FILEGROUP 子句,則全文索引位于與基表或視圖相同的文件組中(對于非分區表),或者位于主文件組中(對于分區表)。
CHANGE_TRACKING [ = ] { MANUAL | AUTO | OFF [ , NO POPULATION ] }指定 SQL Server 是否維護對索引數據的所有更改的列表。更改跟蹤不會記錄通過 WRITETEXT 和 UPDATETEXT 進行的數據更改MANUAL指定是使用 SQL Server 代理按計劃傳播更改跟蹤日志,還是由用戶手動進行傳播。AUTO指定在關聯的表中修改了數據時,SQL Server 自動更新全文索引。默認值為 AUTOOFF [ , NO POPULATION]指定 SQL Server 不保留對索引數據的更改的列表。僅當 CHANGE_TRACKING 為 OFF 時,才能使用 NO POPULATION 選項。如果指定了 NO POPULATION,則 SQL Server 在創建索引后不會對其進行填充。只有在用戶使用 START FULL 或 INCREMENTAL POPULATION 子句執行 ALTER FULLTEXT INDEX 命令后,才會填充索引。如果未指定 NO POPULATION,則 SQL Server 創建索引后將對其進行完全填充。
STOPLIST [ = ] { OFF | SYSTEM | stoplist_name }將全文非索引字表與索引關聯起來。不使用屬于指定非索引字表的任何標記填充索引。如果未指定 STOPLIST,則 SQL Server 會將系統全文非索引字表與索引關聯起來。OFF指定沒有與全文索引關聯的非索引字表SYSTEM指定應對此全文索引使用默認的全文系統 STOPLIST。stoplist_name 指定要與全文索引關聯的非索引字表的名稱。使用稱為“非索引字表”的對象在數據庫中管理非索引字。非索引字表是一個由非索引字組成的列表,這些非索引字在與全文索引關聯時會應用于該索引的全文查詢。若要對全文索引使用非索引字表,需要擁有 REFERENCE 權限。語法:CREATE FULLTEXT STOPLIST stoplist_name[ FROM { [ database_name. ] source_stoplist_name } | SYSTEM STOPLIST ][ AUTHORIZATION owner_name ]stoplist_name 非索引字表的名稱。stoplist_name 最多可包含 128 個字符。stoplist_name 在當前數據庫中的所有非索引字表中必須是唯一的.創建全文索引時將使用 stoplist_name。
database_name source_stoplist_name 指定的非索引字表所在的數據庫的名稱。如果未指定,則 database_name 默認為當前數據庫。
source_stoplist_name 指定通過復制現有的非索引字表來創建新的非索引字表。如果不存在 source_stoplist_name,或者數據庫用戶不具有正確的權限,CREATE FULLTEXT STOPLIST 將失敗,并返回錯誤。如果源非索引字表的非索引字中指定的任何語言未在當前數據庫中注冊,CREATE FULLTEXT STOPLIST 將成功,但會返回警告且不會添加相應的非索引字。
SYSTEM STOPLIST指定用默認存在于 Resource 數據庫中的非索引字表創建新的非索引字表。
AUTHORIZATION owner_name指定擁有此非索引字表的數據庫主體的名稱。owner_name 必須是當前用戶所屬的主體的名稱,或當前用戶必須對 owner_name 擁有 IMPERSONATE 權限。如果未指定,則所有權授予當前用戶。
--創建全文非索引字表的三種方式;1、CREATE FULLTEXT STOPLIST my_Stoplist ---創建新的全文非索引字表2、create fulltext stoplist next_Stoplist from test.my_Stoplist ---從現有的全文非索引字表復制全文非索引字表3、create fulltext stoplist from_system_Stoplist from system STOPLIST ---從系統全文非索引字表復制全文非索引字表
例如:
create fulltext index on t_b(remarks) key index [PK__t_b__uniqueindex] on my_fulltext_indexwith (change_tracking=auto,stoplist=system)GOALTER FULLTEXT INDEX ON [dbo].[t_b] ENABLE--修改表上的全文索引為激活態(ENABLE 激活全文索引;DISABLE 關閉全文索引。)GODROP FULLTEXT INDEX ON t_b ---刪除表上的全文索引--與全文索引相關的關鍵詞和函數有1、contains 和 freetext 都返回 true 或 false 。都在 SELECT 語句中的 where 或 having 子句中使用。它們只能用在指定選擇條件中。2、containstable 和 freetexttable 都返回零行、一行或多行的表,只能使用在 FROM 子句中。它們返回的表中會增加 KEY 和 RANK 兩列。系統就是根據 RANK(值越小,相關性越低) 的值進行排名的。containstable 和 freetexttable 中 可以指定要進行全文搜索的表、要在表中搜索的列(或所有列)以及搜索條件。3、CONTAINSTABLE 和 FREETEXTTABLE 函數用來指定全文查詢以返回每行的相關性排名。
select remarks from t_b where contains|freetext (Remarks,'testfulltext')select remarks from t_b where contains|freetext (Remarks,'"wenzhong"or "zhongwen"')select remarks from t_b where contains|freetext (Remarks ,'"zhao*"')goSELECT a.Remarks, a.Loop_Int,a.name, b.RANKFROM t_b AS a INNER JOIN CONTAINSTABLE|FREETEXTTABLE (t_b, Remarks, '("zhao" ) OR("wenzhong" )') AS b ON a.ID = b.[KEY]WHERE b.RANK > 5AND a.Name <> 'testfulltext'ORDER BY b.RANK DESC
---全文搜索體系結構的各組件 ---------來自聯機幫助
全文非索引字表
為了精簡全文索引,SQL Server 提供了一種機制,用于去掉那些經常出現但對搜索無益的字符串。這些去掉的字符串稱為“非索引字”。在索引創建期間,全文引擎將忽略全文索引中的非索引字。也就是說全文查詢將不搜索非索引字。
非索引字可以是在特定語言中具有含義的詞,也可以是不具有語言含義的“標記”。例如,在英語中,諸如“a”、“and”、“is”和“the”之類的詞將被排除在全文索引之外,這是因為已經知道它們對搜索沒有用處。
新聞熱點
疑難解答