SQL Server全文搜索
看這篇文章之前請先看一下下面我摘抄的全文搜索的MSDN資料,基本上MSDN上關于全文搜索的資料的我都copy下來了
并且非常認真地閱讀和試驗了一次,并且補充了一些SQL語句,這篇文章本人抽取了一些本人自認為是重點的出來
并且加入了一些自己的內容,補充MSDN上沒有的和整理了網上關于全文搜索的資料
至于全文搜索的性能,注意事項,大家可以看我copy下來的文章
文章地址:http://www.cnblogs.com/lyhabc/articles/3254782.html
網上另一篇說全文搜索的也比較詳細
SQL Server 全文目錄相關 地址:http://www.cnblogs.com/dreamontheway/archive/2010/08/19/1809963.html
至于什么是全文搜索我就不說了,網上文章非常多,但是這些文章感覺總結和歸納不全,只是建立一下全文索引,但是并沒有深入一些或者再整理一下
http://msdn.microsoft.com/zh-cn/library/ms142571.aspx
http://msdn.microsoft.com/zh-cn/library/ms142497.aspx
http://msdn.microsoft.com/zh-cn/library/ms142575.aspx
http://msdn.microsoft.com/zh-cn/library/ms142560.aspx
http://msdn.microsoft.com/zh-cn/library/cc879261(v=SQL.105).aspx
http://msdn.microsoft.com/zh-cn/library/ms142505(v=SQL.105).aspx
全文搜索的架構
先上MSDN的一幅圖片
我畫了一幅簡單的圖
其實全文搜索技術也有些人叫全文搜索或者叫全文索引,不過兩種叫法本人都覺得是對的
MSDN中對于普通SQLSERVER和全文索引的區別
全文索引 |
普通 SQL Server 索引 |
---|---|
每個表只允許有一個全文索引。 |
每個表允許有多個普通索引。 |
將數據添加到全文索引的操作稱為“填充”,可以通過計劃或特定請求來請求填充,也可以在添加新數據時自動填充。 |
當插入、更新或刪除作為其基礎的數據時自動更新。 |
在同一個數據庫內分組為一個或多個全文目錄。 |
不分組。 |
在一張表中建立了全文索引后,你不會看到數據表中會有全文索引頁面,因為MSDN說得很清楚,
因為全文索引的行以壓縮格式存儲在磁盤的文件系統里,以優化磁盤的使用,并且這些數據會以二進制數據的形式存儲。
創建全文目錄的時候會有一個選項叫你選擇目錄位置,全文索引就存放在這個位置
當你查詢全文索引列的時候,SQLSERVER就會掃描全文目錄,去找你需要查詢的記錄,所以當你查看執行計劃的時候會看到一個執行計劃“遠程掃描”
遠程掃描基本上占了大頭
全SQL建立全文搜索
在網上看到很多文章都是用SSMS來建立全文索引,本人想用全SQL的方式建立全文索引
(1)先在D盤建立一個文件夾fulltext
建立全文索引的方式有兩種
1 USE [pratice] 2 GO 3 4 5 6 --創建全文索引的方式1: 7 8 -------------開啟全文索引和創建全文索引目錄 全文目錄創建的路徑是D:\fulltext 9 --fulltext_pratice是自己自定義的全文目錄名稱 10 EXEC [sys].[sp_fulltext_database] @action = 'enable' -- varchar(20) 11 12 --如果數據庫中已存在全文目錄fulltext_pratice要先drop掉 13 --EXEC [sys].[sp_fulltext_catalog] @ftcat = 'fulltext_pratice', -- sysname 14 -- @action = 'drop' -- varchar(20) 15 16 EXEC [sys].[sp_fulltext_catalog] @ftcat = 'fulltext_pratice', -- sysname 17 @action = 'create', -- varchar(20) 18 @path = N'D:\fulltext' -- nvarchar(101)
建立[fulltext_test]表 下面打算在id字段上建立全文索引, 建立全文索引的列的要求是not null并且是唯一的!!!
1 CREATE TABLE [dbo].[fulltext_test]( 2 [id] [varchar](200) NOT NULL UNIQUE, --建立全文索引的列的要求是not null并且是唯一的!!! 3 [NAME] [varchar](200) NOT NULL 4 ) ON [PRIMARY] 5 6 7 --在id字段上創建一個非聚集索引,并且是唯一的 8 CREATE UNIQUE NONCLUSTERED INDEX [IX_ID] ON [dbo].[fulltext_test] 9 ( 10 [id] ASC 11 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = ON, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
為表[fulltext_test]創建全文索引 可索引列為 id
1 EXEC [sys].[sp_fulltext_table] @tabname = N'fulltext_test', -- nvarchar(517) 2 @action = 'create', -- varchar(50) 3 @ftcat = fulltext_pratice, -- sysname 4 @keyname = IX_ID -- sysname
1 --@language參數的意義在于分詞,到時候會把id字段里的數據按照各個國家的語言來進行分詞,具體的數字您可以自己指定 2 --2052代表中文,1033代表美文,2057代表英文 3 4 EXEC [sys].[sp_fulltext_column] @tabname = N'fulltext_test', -- nvarchar(517) 5 @colname = id, -- sysname 6 @action = 'add', -- varchar(20) 7 @language = 2052 -- int 2057 is the LCID for 英語 1033 :美語 2052:中文
至于SQLSERVER支持哪些國家的語言您可以使用下面SQL語句進行查詢
1 SELECT * FROM sys.fulltext_languages
1 -------------激活索引 2 EXEC [sys].[sp_fulltext_table] @tabname = N'fulltext_test', -- nvarchar(517) 3 @action = 'activate'
可以看到在全文目錄的屬性對話框里已經建立好全文索引
我們先向[fulltext_test]表插入10行記錄
1 USE [pratice] 2 GO 3 INSERT INTO [dbo].[fulltext_test] ( [id], [NAME] ) 4 SELECT '1','中國' UNION ALL 5 SELECT '2','美國' UNION ALL 6 SELECT '3','英國' UNION ALL 7 SELECT '4','法國' UNION ALL 8 SELECT '5','韓國' UNION ALL 9 SELECT '6','日本' UNION ALL 10 SELECT '7','朝鮮' UNION ALL 11 SELECT '8','印度' UNION ALL 12 SELECT '9','德國' UNION ALL 13 SELECT '10','意大利'
然后填充全文索引,至于什么是填充全文索引這里就不詳細說了,我copy的MSDN里說得很清楚
http://www.cnblogs.com/lyhabc/articles/3254782.html
填充的方式有3種:1、完全填充,2、增量填充,3、自動跟蹤更改
語法:
1 ALTER FULLTEXT INDEX ON 表名 SET CHANGE_TRACKING OFF
一般我們首次創建完全文索引之后先完全填充索引,然后修改填充方式為自動跟蹤更改,等數據有變化的時候只需要把變化的部分填充進去全文索引里
1 ------------填充索引,首次創建完全文索引之后先完全填充索引,把數據全部放入全文索引里 2 USE [pratice] 3 GO 4 ALTER FULLTEXT INDEX ON [dbo].[fulltext_test] SET CHANGE_TRACKING OFF 5 GO 6 ALTER FULLTEXT INDEX ON [dbo].[fulltext_test] START FULL POPULATION 7 GO 8 9 ------------修改填充方式為自動跟蹤更改,等數據有變化的時候只需要把變化的部分填充進去全文索引里就可以了 10 USE [pratice] 11 GO 12 ALTER FULLTEXT INDEX ON [dbo].[fulltext_test] SET CHANGE_TRACKING AUTO 13 GO 14 15 16 ---------------如果是增量填充 17 USE [pratice] 18 GO 19 ALTER FULLTEXT INDEX ON [dbo].[fulltext_test] SET CHANGE_TRACKING OFF 20 GO 21 --或者 22 ALTER FULLTEXT INDEX ON [dbo].[fulltext_test] SET CHANGE_TRACKING MANUAL 23 GO 24 ALTER FULLTEXT INDEX ON [dbo].[fulltext_test] START INCREMENTAL POPULATION 25 GO
增量填充的要求
增量填充是手動填充全文索引的一種替代機制。
您可以對 CHANGE_TRACKING 設置為 MANUAL 或 OFF 的全文索引運行增量填充。
如果全文索引的第一個填充是增量填充,它將對所有行編制索引并使其等效于完全填充。
增量填充要求索引表必須具有 timestamp 數據類型的列。 如果 timestamp 列不存在,則無法執行增量填充。
對不含 timestamp 列的表請求增量填充會導致完全填充操作。
另外,如果影響表全文索引的任意元數據自上次填充以來發生了變化,則增量填充請求將作為完全填充來執行。
這包括更改任何列、索引或全文索引定義所引起的元數據更改。
SQL Server 使用 timestamp 列標識自上次填充后發生更改的行。
然后,增量填充在全文索引中更新上次填充的當時或之后添加、刪除或修改的行。
如果對表進行大量插入操作,則使用增量填充會較使用手動填充有效。
在填充結束時,全文引擎將記錄新的 timestamp 值。 該值是 SQL 收集器遇到的最大 timestamp 值。
以后再啟動增量填充時,將會使用此值。
若要運行增量填充,請執行使用 START INCREMENTAL POPULATION 子句的 ALTER FULLTEXT INDEX 語句
填充計劃
當全文索引不是使用自動跟蹤更改的時候就需要使用填充計劃按照計劃的時間去執行全文索引填充
填充計劃分三種:
1 --(1)把自動跟蹤更改設置為手動,然后UPDATE POPULATION更新填充 2 ALTER FULLTEXT INDEX ON [dbo].[fulltext_test] SET CHANGE_TRACKING MANUAL 3 GO 4 ALTER FULLTEXT INDEX ON [dbo].[fulltext_test] START UPDATE POPULATION; 5 GO 6 7 --(2)把自動跟蹤更改設置為手動或者關閉,然后INCREMENTAL POPULATION增量填充 8 ALTER FULLTEXT INDEX ON [dbo].[fulltext_test] SET CHANGE_TRACKING MANUAL 9 GO 10 --或者 11 ALTER FULLTEXT INDEX ON [dbo].[fulltext_test] SET CHANGE_TRACKING OFF 12 GO 13 ALTER FULLTEXT INDEX ON [dbo].[fulltext_test] START INCREMENTAL POPULATION 14 GO 15 16 --(3)把自動跟蹤更改設置為關閉,然后進行完全填充,一般完全填充只在剛剛創建完全文索引的時候使用 17 ALTER FULLTEXT INDEX ON [dbo].[fulltext_test] SET CHANGE_TRACKING OFF 18 GO 19 ALTER FULLTEXT INDEX ON [dbo].[fulltext_test] START FULL POPULATION 20 GO
大家都喜歡使用SSMS的GUI界面去創建填充計劃,他們以為SQLSERVER沒有提供TSQL給他們創建填充計劃
實際上SSMS中的填充計劃界面相當于創建作業的SQL語句
下面的SQL語句是創建增量填充計劃的SQL語句,大家如果想使用更新填充的話,
只需要在sp_add_jobstep作業步驟里把@command更改為
如果想更改填充計劃的執行間隔,開始時間只需要執行sp_add_jobschedule來修改就可以了
1 'USE pratice ALTER FULLTEXT INDEX ON [dbo].[fulltext_test] SET CHANGE_TRACKING MANUAL 2 3 ALTER FULLTEXT INDEX ON [dbo].[fulltext_test] START UPDATE POPULATION; 4 5 '
創建增量填充計劃
1 --添加作業 2 USE [msdb] 3 GO 4 DECLARE @jobId BINARY(16) 5 EXEC msdb.dbo.sp_add_job @job_name = N'啟動對[fulltext_test]表增量填充', @enabled = 1, 6 @start_step_id = 1, 7 @description = N'已為數據庫pratice中的全文目錄 fulltext_pratice 計劃了對[fulltext_test]表的增量填充。', 8 @job_id = @jobId OUTPUT 9 SELECT @jobId 10 GO 11 ----------------------------------------- 12 --指定要運行本作業的服務器 13 EXEC msdb.dbo.sp_add_jobserver @job_name = N'啟動對[fulltext_test]表增量填充', 14 @server_name = N'joe' 15 GO 16 -------------------------------------- 17 --添加作業計劃 18 USE [msdb] 19 GO 20 DECLARE @schedule_id INT 21 EXEC msdb.dbo.sp_add_jobschedule @job_name = N'啟動對[fulltext_test]表增量填充', 22 @name = N'fulltext_test', @enabled = 1, @freq_type = 4, @freq_interval = 1, 23 @freq_subday_type = 1, @freq_subday_interval = 0, 24 @freq_relative_interval = 0, @freq_recurrence_factor = 1, 25 @active_start_date = 20130815, @active_end_date = 99991231, 26 @active_start_time = 120742, @active_end_time = 235959, 27 @schedule_id = @schedule_id OUTPUT 28 SELECT @schedule_id 29 GO 30 -------------------------------------- 31 --添加作業步驟 32 USE [msdb] 33 GO 34 EXEC msdb.dbo.sp_add_jobstep @job_name = N'啟動對[fulltext_test]表增量填充', 35 @step_name = N'全文索引', @step_id = 1, @cmdexec_success_code = 0, 36 @on_success_action = 1, @on_success_step_id = -1, @on_fail_action = 2, 37 @on_fail_step_id = -1, @retry_attempts = 0, @retry_interval = 0, 38 @os_run_priority = 0, @subsystem = N'TSQL', @command = N' 39 USE pratice 40 ALTER FULLTEXT INDEX ON [dbo].[fulltext_test] SET CHANGE_TRACKING OFF 41 42 ALTER FULLTEXT INDEX ON [dbo].[fulltext_test] START INCREMENTAL POPULATION 43 44 ', @database_name = N'master' 45 GO
創建全文索引的方式2: 方式2我沒有找到全文目錄的路徑在哪里指定@path
1 ------------------------------------------------------------------------- 2 --創建全文索引的方式2: 方式2我沒有找到全文目錄的路徑在哪里指定@path 3 USE [pratice] 4 GO 5 6 CREATE FULLTEXT INDEX ON 表名 7 ( 8 字段名 --Full-text index column name 9 TYPE COLUMN FileExtension --Name of column that contains file type information 10 Language 2052 --2057 is the LCID for British English 11 ) 12 KEY INDEX [IX_ID] ON fulltext_pratice --Unique index 13 WITH CHANGE_TRACKING AUTO --Population type; 填充類型為自動跟蹤更改 14 GO 15 -----------------------------------------------------
卸載全文索引
1 -----------------------卸載全文索引------------------ 2 EXEC sp_fulltext_table 'fulltext_test', 'deactivate' 3 EXEC sp_fulltext_column 'fulltext_test', 'id', 'drop' 4 EXEC sp_fulltext_table 'fulltext_test', 'drop' 5 EXEC sp_fulltext_catalog 'fulltext_pratice', 'stop' 6 EXEC sp_fulltext_catalog 'fulltext_pratice', 'drop'
分詞和非索引字
SQLSERVER會根據創建全文索引的時候指定的國家語言來對數據進行分詞和排除非索引字
比如下面指定2052就是按照中文的意思去對數據進行分詞
1 EXEC [sys].[sp_fulltext_column] @tabname = N'fulltext_test', -- nvarchar(517) 2 @colname = id, -- sysname 3 @action = 'add', -- varchar(20) 4 @language = 2052
還有一個就是非索引字,在全文查詢的過程當中會排除這些非索引字
MSDN中的解釋:
非索引字表。提供系統非索引字表,該非索引字表包含一組基本非索引字(也稱為干擾詞)。
“非索引字”是對搜索沒有任何幫助并且被全文查詢忽略的詞。 例如,在英語區域設置中,
諸如“a”、“and”、“is”和“the”之類的詞都被視為非索引字。 通常情況下
,需要配置一個或多個同義詞庫文件和非索引字表。 有關詳細信息,請參閱為全文搜索配置和管理非索引字和非索引字表。
這里非索引字表實際上就是指下面路徑下的噪聲文件,因為我的SQLSERVER安裝在C盤
C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\FTData
默認的全文目錄也會在這個路徑下創建如果你創建全文目錄的時候不指定全文目錄的路徑的話
這些文件里存儲了各個國家語言的一些噪聲/干擾詞
這些噪聲文件是怎麼起作用的?
看一下下面的SQL語句,按道理應該可以查詢出數據出來,但是。。。
1 USE pratice 2 GO 3 SELECT * FROM [dbo].[fulltext_test] WHERE CONTAINS(id ,'5')
因為5存儲在noiseCHS.txt這個噪聲文件里,所以填充全文索引的時候不會把5這個單詞填充進去全文索引
如果想填充進去全文索引有一個辦法,把noiseCHS.txt文件里第二行$1234567890刪除了就可以了
noiseCHS.txt文件的內容

1 ?about 2 $ 1 2 3 4 5 6 7 8 9 0 _ 3 a b c d e f g h i j k l m n o p q r s t u v w x y z 4 after 5 all 6 also 7 an 8 and 9 another 10 any 11 are 12 as 13 at 14 be 15 because 16 been 17 before 18 being 19 between 20 both 21 but 22 by 23 came 24 can 25 come 26 could 27 did 28 do 29 each 30 for 31 from 32 get 33 got 34 had 35 has 36 have 37 he 38 her 39 here 40 him 41 himself 42 his 43 how 44 if 45 in 46 into 47 is 48 it 49 like 50 make 51 many 52 me 53 might 54 more 55 most 56 much 57 must 58 my 59 never 60 now 61 of 62 on 63 only 64 or 65 other 66 our 67 out 68 over 69 said 70 same 71 see 72 should 73 since 74 some 75 still 76 such 77 take 78 than 79 that 80 the 81 their 82 them 83 then 84 there 85 these 86 they 87 this 88 those 89 through 90 to 91 too 92 under 93 up 94 very 95 was 96 way 97 we 98 well 99 were 100 what 101 where 102 which 103 while 104 who 105 with 106 would 107 you 108 your 109 的 110 一 111 不 112 在 113 人 114 有 115 是 116 為 117 以 118 于 119 上 120 他 121 而 122 后 123 之 124 來 125 及 126 了 127 因 128 下 129 可 130 到 131 由 132 這 133 與 134 也 135 此 136 但 137 并 138 個 139 其 140 已 141 無 142 小 143 我 144 們 145 起 146 最 147 再 148 今 149 去 150 好 151 只 152 又 153 或 154 很 155 亦 156 某 157 把 158 那 159 你 160 乃 161 它
這些非索引字的好處和對性能的影響大家可以查看我摘抄的文章
http://www.cnblogs.com/lyhabc/articles/3254782.html
爬網日志
MSDN中關于爬網的描述
全文填充(也稱為爬網)開始后,全文引擎會將大批數據存入內存并通知篩選器后臺程序宿主
在爬網的過程中會產生一些日志,稱為爬網日志
爬網日志存放在下面這個路徑
C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\LOG
我貼上其中一個日志的內容,里面都是一些關于填充的信息

1 2013-08-15 22:27:27.59 spid18s The full-text catalog monitor reported catalog "fulltext_pratice" (16) in database "pratice" (5) in REINITIALIZE state. This is an informational message only. No user action is required. 2 2013-08-15 22:27:27.59 spid19s Informational: Full-text Full population initialized for table or indexed view '[pratice].[dbo].[fulltext_test]' (table or indexed view ID '667149422', database ID '5'). Population sub-tasks: 1. 3 2013-08-15 22:27:37.64 spid24s Informational: Full-text Full population completed for table or indexed view '[pratice].[dbo].[fulltext_test]' (table or indexed view ID '667149422', database ID '5'). Number of documents processed: 10. Number of documents failed: 0. Number of documents need retry: 0. 4 2013-08-15 22:27:37.65 spid24s Changing the status to MERGE for full-text catalog "fulltext_pratice" (16) in database "pratice" (5). This is an informational message only. No user action is required. 5 2013-08-15 22:28:45.54 spid24s Informational: Full-text Full population initialized for table or indexed view '[pratice].[dbo].[fulltext_test]' (table or indexed view ID '667149422', database ID '5'). Population sub-tasks: 1. 6 2013-08-15 22:28:46.54 spid24s Informational: Full-text Full population completed for table or indexed view '[pratice].[dbo].[fulltext_test]' (table or indexed view ID '667149422', database ID '5'). Number of documents processed: 10. Number of documents failed: 0. Number of documents need retry: 0. 7 2013-08-15 22:28:46.54 spid24s Changing the status to MERGE for full-text catalog "fulltext_pratice" (16) in database "pratice" (5). This is an informational message only. No user action is required. 8 2013-08-15 22:28:46.92 spid24s Informational: Full-text Full population initialized for table or indexed view '[pratice].[dbo].[fulltext_test]' (table or indexed view ID '667149422', database ID '5'). Population sub-tasks: 1. 9 2013-08-15 22:28:51.66 spid56 Informational: Full-text Full population for table or indexed view '[pratice].[dbo].[fulltext_test]' (table or indexed view ID '667149422', database ID '5') was cancelled by user. 10 2013-08-15 22:28:51.69 spid24s Informational: Full-text Full population initialized for table or indexed view '[pratice].[dbo].[fulltext_test]' (table or indexed view ID '667149422', database ID '5'). Population sub-tasks: 1. 11 2013-08-15 22:29:05.54 spid24s Informational: Full-text Full population completed for table or indexed view '[pratice].[dbo].[fulltext_test]' (table or indexed view ID '667149422', database ID '5'). Number of documents processed: 10. Number of documents failed: 0. Number of documents need retry: 0. 12 2013-08-15 22:29:05.54 spid24s Changing the status to MERGE for full-text catalog "fulltext_pratice" (16) in database "pratice" (5). This is an informational message only. No user action is required. 13 2013-08-15 22:29:05.54 spid26s Informational: Full-text Auto population initialized for table or indexed view '[pratice].[dbo].[fulltext_test]' (table or indexed view ID '667149422', database ID '5'). Population sub-tasks: 1.
這里有個題外話,全文搜索也會用到操作系統的搜索服務
在我摘抄的文章里有提到
http://www.cnblogs.com/lyhabc/articles/3254782.html
Microsoft Search 服務
全文索引碎片
全文索引跟聚集索引一樣也是有索引碎片的,下面貼上MSDN中的一些與全文索引碎片有關的內容
因為全文索引通過索引鍵列與分詞列表的映射來找到關鍵詞
全文索引跟普通索引一樣也是有碎片的,而產生碎片的原理跟普通的聚集索引一樣,在更新、刪除、修改之后產生
填充完成后,將觸發最終的合并過程,以便將索引片斷合并為一個主全文索引
請注意,由于合并索引碎片時必須讀取和寫入大量數據,所以主合并可能會耗費大量 I/O,但它不會阻塞傳入的查詢。
對大量數據進行主合并會創建一個長時間運行的事務,在檢查點期間延遲事務日志的截斷。
在這種情況下,事務日志可能會在完整恢復模式下顯著增長。
此語句將執行一次“主合并”,主合并將碎片合并成一個更大的碎片,并從全文索引中刪除所有過時的條目
至于全文索引碎片是怎樣產生的,大家可以看一下本人摘抄文章的最后《全文索引的結構》,里面說得真是非常詳細
http://www.cnblogs.com/lyhabc/articles/3254782.html
下面是查詢全文索引的碎片量的多少和重組/重建全文索引的SQL語句
1 --查看全文索引碎片量 2 SELECT * FROM sys.fulltext_index_fragments 3 GO 4 5 --重組全文索引 6 ALTER FULLTEXT CATALOG fulltext_test REORGANIZE 7 GO 8 --重建全文索引 9 ALTER FULLTEXT CATALOG fulltext_test REBUILD 10 GO
有一天群里面有人問,為什麼SQL ERRORLOG里有很多MERGE FOR FULL-TEXT的信息,實際上這個是全文索引在合并索引,
合并索引一般發生在索引填充之后,不單只在SQL ERRORLOG里能看到MERGE FOR FULL-TEXT的信息,爬網日志也能看到
如果想更多了解合并是怎樣工作的可以看我摘抄的文章
http://www.cnblogs.com/lyhabc/articles/3254782.html
總結
比較:本人覺得不應該用全文索引和普通SQLSERVER索引去比較,因為兩者的實現方式和機制完全不一樣,沒有可比性
不方便的地方:備份,還原,附加數據庫非常不方便,需要特別指定全文目錄的文件夾,是否需要附加全文目錄,之前項目經理就是這個原因而放棄使用
全文搜索,他之前搞的一個網站的評論功能就需要使用全文搜索,聽他說自從那次使用全文搜索之后現在都沒有使用了,現在他使用like關鍵字來代替全文
但是,因為全文有分詞,數據壓縮,搜索條件比較靈活等功能所以個人覺得like關鍵字是沒有辦法和全文搜索比較的
由于全文目錄里的所有文件存儲的都是二進制數據,所以沒有辦法再深入研究了
文章寫到這里了,如有不對的地方,歡迎大家拍磚哦o(∩_∩)o
2014-5-10補充
關于一篇fulltext搜索的帖子
Full-text搜索把“一二三”當成“123”??
我想你需要維護下同義詞詞典,或者限定language_term
同義詞詞典路徑:http://technet.microsoft.com/zh-cn/library/ms142491.aspx#location
同義詞詞典:SQL_Server_install_path/Microsoft SQL Server/MSSQL.1/MSSQL/FTDATA/ tschs.xml
干擾詞詞典:SQL_Server_install_path/Microsoft SQL Server/MSSQL.1/MSSQL/FTDATA/ noiseChs.txt
Chs為簡體中文
<XML ID="Microsoft Search Thesaurus"> <!-- Commented out <thesaurus xmlns="x-schema:tsSchema.xml"> <diacritics_sensitive>0</diacritics_sensitive> <expansion> <sub>Internet Explorer</sub> <sub>IE</sub> <sub>IE5</sub> </expansion> <replacement> <pat>NT5</pat> <pat>W2K</pat> <sub>Windows 2000</sub> </replacement> <expansion> <sub>run</sub> <sub>jog</sub> </expansion> </thesaurus> --> </XML>
--下列 T-SQL 指令碼示範查詢全文檢索索引狀態以及其內容。 SELECT * FROM sys.dm_fts_index_population SELECT * FROM sys.dm_fts_index_keywords( DB_ID('tde'), OBJECT_ID('SalesLT.Product'))
http://blogs.technet.com/b/technet_taiwan/archive/2015/06/02/sql-database-new-features-tde-and-full-text-search.aspx
全文索引限制:
(1)全文索引可對char、varchar、nchar、nvarchar、text、ntext、image、xml、varbinary 或 varbinary(max) 類型字段進行檢索
(2)一個表只能建立一個全文索引(但可以對多個字段)
(3)全文索引的列必須是not null和唯一的
全文索引使用內部表(稱為“全文索引片斷”)來存儲倒排索引數據。 可以使用此視圖來查詢有關這些片斷的元數據。 在此視圖中,每個全文索引片斷在每個包含全文索引的表中各占一行。
填充的方式有3種:1、完全填充,2、增量填充,3、自動跟蹤更改
f
f
f
f
f
sql2008 的全文索引現在是存儲在數據庫中
全文索引基于CHAR/VARCHAR/NVARCHAR/XML/VARBINARY
提供了50個篩選器
全文索引使用語言特有的斷字符word breaker 和詞干分析器stemmer
指定具體語言,單詞之間的breaker
被排除在常用單詞(字)外面的單詞(字)稱為干擾詞stop word,通過指定干擾詞避免大量根本算不上關鍵字的單詞(字)所干擾
一個表/索引視圖只能有一個全文索引
stemmer
n. 抽梗機,除梗器;抽梗工人
文章列表