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 ];
這個命令的參數在表6-6中有描述。
表6-6 CREATE FULLTEXT STOPLIST參數
在這個示例中,將創建新的、不是從既有的非索引字表複製而來的非索引字表(注意全文非索引字表語句必須以分號[;]來結束):
- CREATE FULLTEXT STOPLIST TSQLRecipes;
爲了確認新非索引字表的細節,可以查詢sys.full_text_stoplists系統目錄視圖:
- SELECT stoplist_id,name,principal_id
- FROM sys.fulltext_stoplists
這個查詢返回:
- stoplist_id name principal_id
- 5 TSQLRecipes 1
創建完非索引字表之後,現在可以使用ALTER FULLTEXT STOPLIST命令來填充它。這個命令的語法如下:
- ALTER FULLTEXT STOPLIST stoplist_name
- { ADD 'stopword' LANGUAGE language_term
- | DROP
- {
- 'stopword' LANGUAGE language_term
- | ALL LANGUAGE language_term
- | ALL };
這個命令的參數在表6-7中有描述。
表6-7 ALTER FULLTEXT STOPLIST參數
參數 |
描述 |
stoplist_name |
指定新用戶定義的非索引字表的名稱 |
ADD 'stopword' |
定義非索引字的字符串值。 最長可以添加64個字符 |
LANGUAGE language_term |
定義與非索引字關聯的語言 ——可以是字符串(從sys. syslan- guages中的別名)、 整數(LCID)或十六進制表示 (LCID的十六進制值) |
DROP 'stopword' LANGUAGE language_term |
指定刪除指定的語言下指定的非索引字 |
DROP ALL LANGUAGE language_term |
刪除指定語言下的所有非索引字 |
DROP ALL |
指定從非索引字表中刪除所有非索引字 |
在這個示例中,假定我爲包含引用了SQL Server文檔參考書的表生成索引。在這個例子中,術語"SQL"和"Server"在搜索的上下文中不是非常有用(幾乎所有條目都會包含它)。因此在這個示例中,我將增加兩個新的非索引字到之前創建的非索引字表中:
- ALTER FULLTEXT STOPLIST TSQLRecipes
- ADD 'SQL' LANGUAGE 'English';
- ALTER FULLTEXT STOPLIST TSQLRecipes
- ADD 'Server' LANGUAGE 'English';
在增加兩個新非索引字到非索引字表中之後,可以通過查詢sys.fulltext_stopwords系統目錄視圖來驗證這個列表:
- SELECT stoplist_id,stopword,language
- FROM sys.fulltext_stopwords
這個查詢返回:
- stoplist_id stopword language
- 5 SQL English
- 5 Server English
在下一個查詢中,我將演示將新非索引字表綁定到全文索引上:
- --示例表
- CREATE TABLE dbo.SQLTopic
- (SQLTopic int IDENTITY PRIMARY KEY,
- SQLTopicHeaderNM varchar(255) NOT NULL,
- SQLTopicBody varchar(max) NOT NULL)
- GO
- -- 創建示例目錄
- 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_indexs系統目錄視圖來確認綁定的非索引字表:
- SELECT stoplist_id
- FROM sys.fulltext_indexes
- WHERE object_id = object_id('dbo.SQLTopic')
這個查詢返回:
- stoplist_id
- 5
可以通過使用sys.dm_fts_parser動態管理視圖來測試我的新非索引字是否可以被全文引擎識別。這個DMV的語法如下:
- sys.dm_fts_parser('query_string', lcid,
stoplist_id, accent_sensitivity)
第一個參數query_string,是你可能會用在全文索引搜索中的查詢字符串。lcid是地區標識符,stoplist_id是非索引字表的唯一ID(你可以從sys.fulltext_stoplists中檢索)。accent_sensitivity參數的值可以是1或0,表示你的搜索是否區分重音。如下的查詢使用前面創建的非索引字表測試搜索短語SQL Server 2008 Transact-SQL Recipes來演示這個DMV:
- SELECT display_term, special_term
- FROM sys.dm_fts_parser
- ('"SQL Server 2008 Transact-SQL Recipes"', 1033, 5, 0)
結果返回了每個關鍵字的列表,以及它們被視爲何種類型(干擾字/非索引字或精確匹配):
- display_term special_term
- sql Noise Word
- server Noise Word
- 2008 Exact Match
- nn2008 Exact Match
- transact Exact Match
- sql Noise Word
- transactsql Exact Match
- recipes Exact Match
正如你從結果中看到的,SQL和Server都被識別爲干擾字(非索引字)。
在下一個查詢中,演示從非索引字表中刪除非索引字(就算非索引字表已經綁定到全文索引上也是可以的):
- ALTER FULLTEXT STOPLIST TSQLRecipes
- DROP 'Server' LANGUAGE 'English';
使用DROP FULLTEXT STOPLIST命令來刪除非索引字表。但是要想刪除它,必須先使用它從全文索引中對非索引字表解除綁定。這個技巧的最後一個查詢演示了從全文索引中移除非索引字表的設置,然後刪除非索引字表:
- ALTER FULLTEXT INDEX ON dbo.SQLTopic
- SET STOPLIST SYSTEM
- GO
- DROP FULLTEXT STOPLIST TSQLRecipes;
解析
這個技巧演示瞭如何通過創建用戶定義且包含非索引字列表的非索引字表從全文索引中去掉普通字符串。使用CREATE FULLTEXT STOPLIST命令來創建非索引字表。在創建索引字表之後,就可以使用ALTER FULLTEXT STOPLIST來增加非索引字字符串到非索引字表中,或從非索引字表中移除非索引字字符串。使用sys.fulltext_stoplists和sys.fulltext_stopwords系統目錄視圖來確認設置。然後創建新表和全文目錄,再通過指定WITH STOPLIST = TSQLRecipes創建使用了新的非索引字的新全文索引。可以通過使用sys.dm_fts_parser來測試非索引字表中的非索引字是否被恰當地忽略。使用帶有SET STOPLIST的ALTER FULLTEXT INDEX從全文索引中移除非索引字表,隨後是DROP FULLTEXT STOPLIST命令。