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命令。