文章出處

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
View Code

這些非索引字的好處和對性能的影響大家可以查看我摘抄的文章

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.
View Code

 

這里有個題外話,全文搜索也會用到操作系統的搜索服務

在我摘抄的文章里有提到

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搜索的帖子

帖子地址:http://social.msdn.microsoft.com/Forums/zh-CN/290ad5f6-c0cc-497d-89da-6936d9d3bb57/fulltext123?forum=sqlserverzhchs

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. 抽梗機,除梗器;抽梗工人

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()