天天看點

SqlServer2008執行個體32全文索引和全文目錄之從全文索引中去掉普通字元串

    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
           
SqlServer2008執行個體32全文索引和全文目錄之從全文索引中去掉普通字元串

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
           
SqlServer2008執行個體32全文索引和全文目錄之從全文索引中去掉普通字元串

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;
           

繼續閱讀