SQL Server 2008引入了辨別出那些對全文索引搜尋無益的普通字元串的能力。這些無益的字元串被稱為非索引字(SQL Server的早期版本中稱為幹擾詞),并且包含在非索引字表中。非索引字表包含一個或多個非索引字,以及用來在會文索引中連接配接。 SQL Server為所有支援的語言提供了包含普通非索引字的系統預設非索引字表。
使用CREATE FULLTEXT STOPLIST指令來建立你自定義的非索引字表。文法如下:
CREATE FULLTEXT STOPLIST stoplist_name
[ FROM { [ database_name.]source_stoplist_name } | SYSTEM STOPLIST ]
[ AUTHORIZATION owner_name ]
;
CREATE FULLTEXT STOPLIST參數
參 數 | 描 述 |
stoplist_name | 提供新的使用者定義的非索引字表的名稱 |
database_name.]source_stoplist_name | 可以從引用資料庫名稱,也可以引用從既有非索引字表複制的源非索引字表名稱 |
SYSTEM STOPLIST | 複制系統預設的非索引字表 |
AUTHORIZATION owner_name | 定義資料庫主體非索引字表的擁有者 |
1.建立新的、不是從既有的非索引字表複制而來的非索引字表(注意全文非索引字表語句必須以分号[;]來結束):
USE AdventureWorks
GO
CREATE FULLTEXT STOPLIST TSQLRecipes;
2.查詢sys.fullext_stoplists系統目錄視圖:
USE AdventureWorks
GO
SELECT stoplist_id,name,principal_id
FROM sys.fulltext_stoplists
3. 建立完非索引字表之後,使用ALTER FULLTEXT STOPLIST指令來填充它。這個指令的文法如下:
ALTER FULLTEXT STOPLIST stoplist_name
{
ADD 'stopword' LANGUAGE language_term
| DROP
{
'stopword' LANGUAGE language_term
| ALL LANGUAGE language_term
| ALL
}
;
ALTER FULLTEXT STOPLIST參數
參 數 | 描 述 |
stoplist_ name | 指定新使用者定義的非索引字表的名稱 |
ADD 'stopword‘ | 定義非索引字的字元串值。最長可以添加64個字元 |
LANGUAGE language_term | 定義與非索引字關聯的語言——可以是字元串(從sys.syslanguages中的另名)、整數(LCID)或十六進制表示(LCID的十六進 制值) |
DROP 'stopword' LANGUAGE language_term | 指定删除指定的語言下指定的非索引字 |
DROP ALL LANGUAGE language_term | 删除指定語言下的所有非索引字 |
DROP ALL | 指定從非索引字表中删除所有非索引字 |
假定為包含引用了SQL Server文檔參考書的表生成索引。在這個例子中,術語“SQL"和"Server"在搜尋的上下文中不是非常有用(幾乎所有條目都會包含它)。是以增加兩個新的非索引字到之前建立的非索引字表中:
USE AdventureWorks
GO
ALTER FULLTEXT STOPLIST TSQLRecipes
ADD 'SQL' LANGUAGE 'English';
ALTER FULLTEXT STOPLIST TSQLRecipes
ADD 'Server' LANGUAGE 'English';
在增加兩個新非索引字到非索引字表中之後,可以通過查詢sys.fulltext_stopwords系統目錄視 圖來驗證這個清單:
USE AdventureWorks
GO
SELECT stoplist_id,stopword,language
FROM sys.fulltext_stopwords
4.将新非索引字表綁定到全文索引上:
USE AdventureWorks
GO
--示例表
CREATE TABLE dbo.SQLTopic
(
SQLTopic int IDENTITY PRIMARY KEY,
SQLTopicHeaderNM varchar(255) NOT NULL,
SQLTopicBody varchar(max) NOT NULL
)
--建立示例目錄
CREATE FULLTEXT CATALOG ftcat_SQLDocumentation
AS DEFAULT
GO
--建立要綁定到新非索引字的全文索引
--使用sp_help 'dbo.sqltopic'來檢視實際的主鍵限制名
CREATE FULLTEXT INDEX ON dbo.SQLTopic(SQLTopicBody)
KEY INDEX PK_SQLTopic_AD5554EC442B18F2
WITH STOPLIST=TSQLRecipes
GO
使用sys.fulltext_indexes系統目錄視圖來确認綁定的非索引字表
USE AdventureWorks
GO
SELECT stoplist_id
FROM sys.fulltext_indexes
WHERE object_id=object_id('dbo.SQLTopic')
可以通過使用sys .dm_fts_parser動态管理視圖來測試我的新非索弓1字是否可以被全文引擎識别。這個DMV的文法如下:
sys.dm_fts_parser('query_string',1cid,stoplist_id,accent_sensitivity)
第一個參數query_string,是可能會用在全文索引搜尋中的查詢字元串。lcid是地區辨別符,stoplist_id是非索引字表的唯一ID(你可以從sys.fulltext_stoplists中檢索)。 accent_sensitivity參數的值可以是1或0,表示你的搜尋是否區分重音。如下的查詢使用前面建立的非索引字表測試搜尋短語SQL Server 2008 Transact-SQL Recipes來示範這個DMV:
USE AdventureWorks
GO
SELECT display_term,special_term
FROM sys.dm_fts_parser('"SQL SERVER 2008 Transact-SQL Recipes"',1033,5,0)
5. 從非索引字表中删除非索引字(就算非索引字表已經綁定到全文索引上也是可以的);
USE AdventureWorks
GO
ALTER FULLTEXT STOPLIST TSQLRecipes
DROP 'Server' LANGUAGE 'English';
使用DROP FULLTEXT STOPLIST指令來删除非索引字表。但是要想删除它,必須先使用它從全文索引中對非索引字表解除綁定。
6.從全文索引中移除非索引字表的沒置,然後删除非索引字表:
USE AdventureWorks
GO
ALTER FULLTEXT INDEX ON dbo.SQLTopic
SET STOPLIST SYSTEM
GO
DROP FULLTEXT STOPLIST TSQLRecipes;