--> Title : Sql2005 全文索引(五)
--> Author : wufeng4552
--> Date : 2009-10-15
實戰(zhàn)篇(續(xù))
(7)使用全文搜索查詢
設置完全文索引并填充完畢之后,就可以通過全文搜索來查詢數(shù)據(jù)了。使用全文搜索來查詢數(shù)據(jù)所用到的 T-SQL 語句也是 SELECT 語句,只是在設置查詢條件時和前面所說過的 SELECT 語句的查詢條件設置有些不同。在 T-SQL 語言中,可以在 SELECT 語句的 WHERE 子句里設置全文搜索的查詢條件,也可以在 FROM 子句里設置查詢條件,此時將返回結(jié)果作為 FROM 子句中的表格來使用。
如果要在 WHERE 子句里設置全文搜索的查詢條件,可以使用 CONTAINS 和 FREETEXT 兩個謂詞;如果要在 FROM 子句里設置全文搜索的查詢條件 ,可以使用 CONTAINSTABLE 和 FREETEXTTABLE 兩個行集值函數(shù).
(7.1) 使用 CONTAINS 搜索
CONTAINS 用于 SELECT 語句的 WHERE 子句中,可以支持使用復雜的語法在字符列中搜索詞、子句、衍生字或位置相近的字符串。使用 CONTAINS 謂詞可以在數(shù)據(jù)表中使用以下五種形式搜索數(shù)據(jù):
簡單詞:也就是可以搜索一個或多個特定的詞或短語。詞可以包括一個或多個字符,中間沒有空格或標點。短語可以是由空格分隔的多個詞組成,但詞之間可以有標點也可以沒標點。
派生詞:也就是可以搜索特定詞的變形,一般是指英語中的單詞,其有過去式、現(xiàn)在式、將來式等不同的形式。派生詞是指可以包含該單詞的所有其他形式。
前綴詞:也就是可以搜索指定文本開頭的詞或短語。一般也用于英文單詞中,可以指定一個英文單詞的前幾個字母來作為搜索條件。
加權詞:也就是可以給多個搜索條件加上權值,加權值越高的記錄排在越前面。
鄰近詞:也就是可以搜索與另一個詞或短語相鄰近的詞或短語。
下面分別介紹如何使用這些不同的方式來搜索數(shù)據(jù)
CONTAINS 具體語法請參考聯(lián)機幫助!
(7.1.1) 簡單詞的搜索方式
簡單詞的搜索方式就是搜索一個或多個特定的詞或短語。
例一、搜索文章表的標題中含有 “ 上海 ” 的記錄,其代碼如下:
SELECT * FROM 文章 WHERE CONTAINS( 標題 ,' 上海 ')
例二、搜索文章表的內(nèi)容中含有 “ 上海 ” 或 “ 廣州 ” 的記錄,其代碼如下:
SELECT * FROM 文章 WHERE CONTAINS( 內(nèi)容 ,' " 上海 " OR " 廣州 "')
注意例二與例一的不同,在 CONTAINS 謂詞的第二個參數(shù)里,將 “” 上海 ” OR “ 廣州 ”” 做為一個字符串傳遞 CONTAINS 。使用以下代碼將會出錯: SELECT * FROM 文章 WHERE CONTAINS( 內(nèi)容 ,' 上海 ‘ OR ’ 廣州 ')
(7.1.2) 派生詞的搜索方式
派生詞的搜索方式主要用在英文當中,因為英文單詞中含有現(xiàn)在式、過去式、將來式、單復數(shù)等不同的形式,使派生詞的搜索方式可以將字段中包括該單詞的所有形式的記錄都搜索出來。例如使用派生詞方式搜索包含單詞 download 的記錄,則會把包含 download 、 downloading 等派生詞的記錄都搜索出來。
例三、搜索文章表中內(nèi)容中含有 download 及其派生詞的記錄,其代碼如下:
SELECT * FROM 文章 WHERE CONTAINS( 內(nèi)容 ,'FORMSOF(INFLECTIONAL,download)')
注意 CONTAINS 謂詞的不同處,運行結(jié)果如圖7.1 所示
在圖7.1 中可以看到只查詢到一條記錄,而并未將 download 的派生詞也搜索進來,這是因為從一開始設置全文索引時,所采用的是數(shù)據(jù)庫默認的斷字符語言,即簡體中文,而在中文中沒有派生詞,所以使用派生詞方式搜索數(shù)據(jù)是起不到其作用的。此時可以通過修改全文索引的斷字符語言來達到搜索效果。修改方式如下:
( 1 )右擊全文索引所在的數(shù)據(jù)表,在彈出的快捷菜單中選擇【全文索引】-- 【屬性】-- 【全文索引屬性】對話框。
( 2 )在【全文索引屬性】對話框里選擇【列】選項,彈出如圖7.2 所示對話框,修改【內(nèi)容】字段的【斷字符語言】為 “English” 。
( 3 )單擊【確定】按鈕完成操作。
再次運行例三中的代碼,其運行結(jié)果如圖 7.3 所示。
(7.1.3) 前綴詞的搜索方式
前綴詞的搜索方式主要也是用在搜索英文中,例如搜索以 “do” 開頭的單詞,則可以將 doctor 、 document 、 download 等單詞都搜索出來。
例四、搜索文章表中內(nèi)容中含有 “do” 開頭的單詞的記錄,其代碼如下:
SELECT * FROM 文章 WHERE CONTAINS( 內(nèi)容 ,' "do*" ')
此方式有點類似與 like 子句的通配符方式,但只能使用 “*” ,并且只能放在英文字母之后,如 “*do” 、 “*do*” 都是錯誤的表達方式。
(7.1.4) 加權詞的搜索方式
當以多個字符串作為搜索條件搜索記錄時,可以為不同的字符串加上一個加權值,這個加權值是介于 0 和 1 之間的數(shù)值,加權值越高的記錄排在越前面
例五、搜索文章表中內(nèi)容中含有 “download" 、 “ 上海 ” 、 “ 山西 ” 的記錄,并為不同的條件加上加權值,其代碼如下:
SELECT * FROM 文章 WHERE CONTAINS( 內(nèi)容 , 'ISABOUT ("download" weight(0.9), " 上海 " weight(0.6), " 山西 " weight(0.5))')
或
SELECT * FROM 文章 WHERE CONTAINS( 內(nèi)容 , 'ISABOUT (download weight(0.9), 上海 weight(0.6), 山西 weight(0.5))')
事實上在該 SELECT 語句的返回結(jié)果集里,并沒有按加權值的大小來排序,因為 WEIGHT 不影響 CONTAINS 查詢的結(jié)果,只會影響 CONTAINSTABLE 查詢中的排序。 說明:使用本例時最好將 “ 內(nèi)容 ” 字段的 “ 斷字符語言 ” 改回簡體中文,否則會影響中文的搜索結(jié)果
(7.1.5) 鄰近詞的搜索方式
鄰近詞的搜索方式可以搜索記錄中位置相近的兩個字符,例如要搜索文章標題為 “ 教育部擬取消教師資格終身制實行定期認證 ” 的文章,完整的標題名記不清楚了,只記得 “ 教育部 ” 和 “ 資格 ” ,則可以以鄰近詞的搜索方式進行查詢
例六、搜索文章內(nèi)容中與教育部表示相關的記錄,其代碼如下:
SELECT * FROM 文章 WHERE CONTAINS( 內(nèi)容 ,' " 教育部 " NEAR " 表示 "')
(7.2) 使用 FREETEXT 搜索
FREETEXT 搜索方式與 CONTAINS 搜索方式相比,其搜索結(jié)果表現(xiàn)都十分不精確,因為 FREETEXT 的搜索方式是將一個句子中的每個單字拆分開進行搜索的。例如:如果使用 CONTAINS 搜索方式搜索條件為 “ 教育部 ” 的記錄,那么搜索出來的將是記錄里包含 “ 教育部 ” 三個字符串的記錄。如果使用 FREETEXT 搜索方式搜索條件為 “ 教育部 ” 的記錄,那么搜索出來的將是記錄里包含 “ 教 ” 或 “ 育 ” 或 “ 部 ” 的記錄。如果搜索的是英文字符串 “SQL Server 2005” ,則拆分為 “SQL” 、 “Server” 和 “2005” 來進行搜索,只要滿足其中一個條件都算搜索成功。 FREETEXT 的語法代碼參考聯(lián)機幫助 用 CONTAINS 和 FREETEXT 兩種方式來搜索 “ 教育部 ” 字符串,其代碼如下:
SELECT * FROM 文章 WHERE FREETEXT( 內(nèi)容 ,' 教育部 ')
SELECT * FROM 文章 WHERE CONTAINS ( 內(nèi)容 ,' 教育部 ')
其運行結(jié)果如圖7.4 所示,使用 CONTAINS 查詢結(jié)果要比使用 FREETEXT 的查詢結(jié)果記錄數(shù)要少得多。
7.4CONTAINS和FREETEXT的查詢結(jié)果
(7.3) 使用 CONTAINSTABLE 搜索
CONTAINSTABLE 函數(shù)與 CONTAINS 謂詞類似,其可以返回符合條件的多條記錄,但是返回的記錄是作為數(shù)據(jù)表出現(xiàn)在 SELECT 語句的 FROM 子句中。這個數(shù)據(jù)表里只包含兩個字段:一個字段名為 “KEY” ,該字段顯示的是全文索引的唯一索引鍵的內(nèi)容,也就是圖 14.6 所示界面中所創(chuàng)建的索引列;另一個字段名為 “RANK” ,該字段是排名值字段,其排名值是由系統(tǒng)依查詢符合的程度自動生成的。 CONTAINSTABLE 的語法代碼參考聯(lián)機幫助
CONTAINSTABLE 與 CONTAINS 的搜索條件一樣分為五類,其形式也幾乎一樣,只是增加了 table 和 top_n_by_rank 兩個參數(shù):
table :全文索引所在的數(shù)據(jù)表名。
top_n_by_rank :返回的記錄數(shù),相當于 SELECT 語句中的 top n 。
下面舉幾個例子說明 CONTAINSTABLE 與 CONTAINS 在用法上不同的地方。
查看文章表中內(nèi)容含有 “ 教育部 ” 的記錄的編號,其代碼如下:
SELECT * FROM CONTAINSTABLE( 文章 , 內(nèi)容 ,' 教育部 ') as table1
在本例中可以看到, CONTAINSTABLE 返回的結(jié)果是作為數(shù)據(jù)表的形式出現(xiàn)在 FROM 子句中。其運行結(jié)果如圖 7.5 所示,查詢的結(jié)果也就是 CONTAINSTABLE 返回的數(shù)據(jù)表的結(jié)果,只有兩個字段。
查看文章表中內(nèi)容含有 “ 教育部 ” 和 “ 表示 ” 的前十條記錄,并按查詢符合程度排序,其代碼如下:
SELECT * FROM 文章 JOIN CONTAINSTABLE( 文章 , 內(nèi)容 ,' " 教育部 " NEAR " 表示 " ',10) as table
ON 文章 . 編號 = table1.[KEY] ORDER BY table1.RANK DESC
其運行結(jié)果如圖7.6 所示,在本例中,將 CONTAINSTABLE 函數(shù)返回的數(shù)據(jù)表與文章表 JOIN 起來進行聯(lián)合查詢,就好像一個真實的數(shù)據(jù)表一樣。由于 KEY 是關鍵字,所以在本例當中用方括號將 KEY 括起來。
例十、搜索文章表中內(nèi)容中含有 “download” 、 “ 上海 ” 、 “ 山西 ” 的記錄,并為不同的條件加上加權值,然后按權值排序。其代碼如下: SELECT * FROM 文章 JOIN CONTAINSTABLE( 文章 , 內(nèi)容 , 'ISABOUT ("download" weight(0.9), " 上海 " weight(0.6), " 山西 " weight(0.1))') AS TABLE1 ON 文章 . 編號 = TABLE1.[KEY] ORDER BY TABLE1.RANK DESC 其運行結(jié)果如圖 7.7 所示, RANK 字段是依符合程度生成的數(shù)據(jù)再加上權值后的結(jié)果
(7.4) 使用 FREETEXTTABLE 搜索
與 CONTAINSTABLE 一樣, FREETEXTTABLE 函數(shù)也是返回擁有 KEY 和 RANK 兩個字段的表,該表可以和數(shù)據(jù)庫中的數(shù)據(jù)表一樣使用。 FREETEXTTABLE 的語法 與 FREETEXT 謂詞的語法代碼相似,只是多了 table 和 top_n_by_rank 兩個參數(shù)。
例十一、查看文章表中 “ 內(nèi)容 ” 字段含有 “ 教育部 ” 的前十條記錄,其代碼如下:
SELECT 文章 . 內(nèi)容 ,TABLE1.* FROM 文章 JOIN FREETEXTTABLE( 文章 , 內(nèi)容 ,' 教育部 ',8) AS TABLE1
ON 文章 . 編號 = TABLE1.[KEY]
(7.5) 搜索 image 字段
在 SQL Server 2005 的 image 類型的字段里,不僅僅是可以存儲圖形文件,還可以存儲如可執(zhí)行文件、音樂文件、文本文件等眾多文件類型。 SQL Server 2005 支持對存儲在 image 類型的字段里的一些文件的內(nèi)容進行全文搜索,但在創(chuàng)建全文索引時必須指明存儲在 image 字段里的文件的類型。如圖5.3 所示
SQL Server 2005 支持對存儲在 image 中的純文本文件、網(wǎng)頁文件、 Word 文件、 Excel 文件和 PowerPoint 文件的內(nèi)容進行查詢,其擴展名字段必須分別為 txt 、 htm 、 doc 、 xls 和 ppt 。全文索引創(chuàng)建完畢后,對 image 字段里的文件內(nèi)容進行查詢的方法與其他字段的查詢方法是一樣的:
例十二、查詢存儲在文章表的文件字段里的內(nèi)容包含 “ 數(shù)據(jù)庫 ” 的文件,其代碼如下
SELECT 編號 , 標題 , 文件 , 擴展名 FROM 文章 WHERE CONTAINS( 文件 ,' 數(shù)據(jù)庫 ')
(8)2005新增:與全文索引相關的T-SQL語句
在 SQL Server 2005 以前的版本中,創(chuàng)建與管理全文目錄、全文索引主要是使用存儲過程來完成。從 SQL Server 2005 開始新增加了一些與全文索引相關的 T-SQL 語句,可以用來創(chuàng)建與管理全文目錄和全文索引。
(8.1) 創(chuàng)建全文目錄
創(chuàng)建全文目錄的 T-SQL 語句為
例十三、在 Northwind 數(shù)據(jù)庫中創(chuàng)建一個名為 “TSQL 全文目錄 ” 全文目錄,其代碼如下:
CREATE FULLTEXT CATALOG TSQL 全文目錄
ON FILEGROUP [PRIMARY]
IN PATH 'E:"book"SQL Server 2005 大全 " 數(shù)據(jù)庫 " 第十四章 " 運行后數(shù)據(jù)庫 '
AS DEFAULT
(8.2) 更改全文目錄屬性
創(chuàng)建完全文目錄之后,如果發(fā)現(xiàn)其設置有不如意之處,可以用 T-SQL 語句對其進行修改。更改全文目錄屬性的 T-SQL 語代碼如下:
例十四、重新生成 “TSQL 全文目錄 ” ,其代碼如下:
ALTER FULLTEXT CATALOG TSQL 全文目錄
REBUILD
(8.3) 創(chuàng)建全文索引
有了全文目錄后,可以在全文目錄里創(chuàng)建全文索引。一個全文目錄里可以包含多個全文索引,但一個全文索引只能屬于一個全文目錄。每個數(shù)據(jù)表只能有一個全文索引。創(chuàng)建全文索引的 T-SQL 語句代碼如下:
例十五、為 “ 文章 ” 表的 “ 標題 ” 、 “ 內(nèi)容 ” 和 “ 文件 ” 三個字段創(chuàng)建全文索引,其代碼如下:
CREATE FULLTEXT INDEX
ON 文章 ( 標題 , 內(nèi)容 , 文件 TYPE COLUMN 擴展名 )
KEY INDEX PK_ 文章
ON TSQL 全文目錄
注意:由于在前面的章節(jié)里已經(jīng)為 “ 文章 ” 表創(chuàng)建了全文索引,因此在運行本例之前要先把原來創(chuàng)建的
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
