一、開啟SQL Full-text服務:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2Lc1DNXlVMshFZ0QWbixGaykFbkJjYox2RlZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TN2cDOygzM1ETMwkDMzEDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
保證 SQL Full-text Filter Daemon Launcher服務處于開啟狀态,不同版本SQLServer全文檢索服務名稱可能稍有不同,如果服務清單中沒有這個服務,請使用SQLServer安裝CD光牒安裝“全文檢索”元件。
二、 啟用全文檢索
執行SQL語句啟用全文檢索:Execute sp_fulltext_database 'enable'
三、設定全文語言為中文
在伺服器->屬性->進階中,設定預設全文語言為2052(中文)。
四、建立資料表
在需要全文檢索的資料表中,必須有一列字元型的字段存放檔案類型,例如建表語句中的FileType。必須有一列Varbinary(Max)類型的字段存放檔案内容,例如建表語句中的FileContent。
建表SQL語句示例:
CREATE TABLE SampleBlobTable
(
[PKID] int identity(1,1) primary key,
[FileName] Nvarchar(255) null,
[FileType] Nvarchar(32) null,
[FileContent] VARBINARY(MAX) NULL,
[AddTime] datetime default(getdate())
)
五、建立全文索引
步驟1 建立全文索引
在需要全文檢索的資料表上點選右鍵->全文索引->定義全文索引。
步驟2 選擇唯一索引
步驟3 選擇表列
選擇表列,本例中以FileType列标明檔案格式,将檔案存入資料庫時須正确填寫此字段,此字段中的資料内容包括“doc”、“txt”、“xls”等。
後續步驟無需更改預設值,點選下一步繼續直至完成。
六、支援PDF檔案
1. 安裝 Adobe iFilter
Adobe iFilter6.0:
http://www.adobe.com/support/downloads/thankyou.jsp?ftpID=2611&fileID=2457
Adobe iFilter9.0for 64bit:
http://www.adobe.com/support/downloads/thankyou.jsp?ftpID=4025&fileID=3941
2. 執行SQL語句
execsp_fulltext_service 'load_os_resources', 1;
exec sp_fulltext_service'verify_signature', 0;
3. 重新啟動SQLSERVER
4. 檢查支援檔案
執行下列語句:
select document_type,path from sys.fulltext_document_types wheredocument_type ='.pdf',如查詢結果為下圖則表示成功,可以進行PDF的全文檢索了。
l
圖3 執行結果
七、查詢文法及示例
5. 文法
CONTAINS
(
{
column
|
* }
, '
<contains_search_condition >
'
)
< contains_search_condition >::=
{
< simple_term >
| < prefix_term >
| < generation_term >
| < proximity_term >
| < weighted_term >
}
| {
(
<contains_search_condition >
)
{
AND | AND NOT | OR } < contains_search_condition > [ ...
n
]
}
< simple_term > ::=
word
|
" phrase "
< prefix term> ::=
{
"word * "
|
"phrase *
"
}
< generation_term > ::=
FORMSOF ( INFLECTIONAL , < simple_term > [ ,...
n
] )
< proximity_term > ::=
{
< simple_term > | < prefix_term > }
{
{ NEAR | ~ } { < simple_term > | < prefix_term >} } [ ...
n
]
< weighted_term > ::=
ISABOUT
(
{
{
<simple_term>
| < prefix_term >
| < generation_term >
| < proximity_term >
}
[ WEIGHT
( weight_value )
]
}
[
,
...
n
]
)
6. 示例
1. 查找檔案内容含“合同”的資料。
select * from SampleBlobTable where contains(filecontent,'合同')
注意:如果查詢條件中包含空格,查詢條件需用雙引号括起來,如'”合同”',否則視為文法錯誤。
2. 查找檔案内容含“歸檔”或“标題”的資料。
select * from SampleBlobTable where contains(filecontent,'歸檔 OR 标題')
注意:多個詞之間用邏輯操作符連接配接 (包括 AND ,AND NOT,OR)。如果詞中包含空格,那麼這個詞要用雙引号括起來。
3. 查找檔案内容含“北京?站”的資料。
select * from SampleBlobTable where contains(filecontent,'北京Near 站')
注意:上述SQL語句将傳回包含“北京站”、“北京西站”、“北京東站”等“北京”與“站”無間隔或間隔一個漢字(如果是英文則為一個單詞)的資料,不會包含“北京東南站”的資料。
4. 查找所有開頭字母為”hu”的資料。
select * from SampleBlobTable wherecontains(filecontent,'hu*')
注意:上述SQL語句将傳回包含”human”、”hungry”等單詞的資料,此文法隻針對英文有效,針對中文“*”符号無論有無,效果均相同。
5. 權重查詢
select * from SampleBlobTable where contains(filecontent,'ISABOUT (city weight (.8),county weight (.4))')
注意:上述SQL語将将針對city和county兩個詞進行不同權重的查詢,權重不同将影響傳回資料集的顯示順序(如果限定傳回數量,則間接影響是否傳回資料)。
6. 多态查詢
select * from SampleBlobTable where contains(filecontent,'FORMSOF (INFLECTIONAL,dry)')
注意:查詢将傳回包含”dry”,”dried”,”drying”等資料,針對英語有效。
附:文檔修改曆史
内容 | 修改人 | 時間 | 備注 |
建立 | 卞吉東 | 2012-03-29 | |
增補 | 卞吉東 | 2012-04-01 | 增加支援PDF檔案方法 |