sql server 全文檢索有兩種搜索方式,一種是contains,另一種是freetext。前者是包含,類(lèi)似于
like '%關(guān)鍵詞%',后者則是將一段文字分詞以后對(duì)每個(gè)詞進(jìn)行搜索。
具體語(yǔ)法:
contains:
SELECT 字段1,字段2
FROM 表名
WHERE contains(字段,'"詞一" or "詞二"')
根據(jù)查找結(jié)果的相似度排序
SELECT 字段1,字段2
FROM 表名
inner join containstable(表名, 字段,'"詞一" or "詞二"',10) as k
on 表名.id = k.[key]
order by k.RANK DESC
freetext:
SELECT 字段1,字段2
FROM 表名
WHERE freetext(字段,'詞一詞二')
根據(jù)查找結(jié)果的相似度排序
SELECT 字段1,字段2
FROM 表名
inner join freetexttable(表名, 字段,'詞一詞二',10) as k
on 表名.id = k.[key]
order by k.RANK DESC
上文中freetexttable或containstable的10表示取10條數(shù)據(jù)
最近搜索了一下全文檢索,發(fā)現(xiàn)了一些問(wèn)題,現(xiàn)在總結(jié)如下:
全文索引和查詢(xún)概念(摘自SQL 聯(lián)機(jī)幫助)
全文索引、查詢(xún)和同步化最主要的設(shè)計(jì)要求是,在注冊(cè)進(jìn)行全文檢索的所有表上都有一個(gè)唯一的全文鍵列(或者單列主鍵)。全文索引對(duì)使用的重要字及其所在位置進(jìn)行跟蹤。
例如,假定有一個(gè)對(duì) DevTools 表的全文索引。全文索引可能指出在 Abstract 列的第 423 個(gè)和第 982 個(gè)單詞處找到了單詞 Microsoft,所在的行與 ProductID 6 關(guān)聯(lián)。該索引結(jié)構(gòu)支持對(duì)所有包含被索引單詞的項(xiàng)進(jìn)行有效檢索,以及高級(jí)檢索操作,如短語(yǔ)檢索和鄰近檢索。
為防止全文索引因包含很多對(duì)檢索沒(méi)有幫助的詞而變得臃腫,a、and、is 或 the 這類(lèi)額外的詞都忽略不計(jì)。例如,指定"the products ordered during these summer months"與指定"products ordered during summer months"是一樣的。有這兩個(gè)字符串的行都會(huì)被返回。
目錄 \Mssql\Ftdata\Sqlserver\Config 下提供了多種語(yǔ)言的干擾詞列表。在安裝帶有全文檢索支持的 Microsoftreg; SQL Server#8482; 時(shí)會(huì)創(chuàng)建這個(gè)目錄,并同時(shí)安裝干擾詞文件。干擾詞文件可以編輯。例如,高技術(shù)公司的系統(tǒng)管理員可以把單詞 computer 添加到他們的干擾詞表中去。(如果編輯干擾詞文件,則必須在更改生效之前重新填充全文目錄。)下表顯示了干擾詞文件及其相應(yīng)的語(yǔ)言。
干擾詞文件 語(yǔ)言
-------------- ---------
Noise.chs 簡(jiǎn)體中文
Noise.cht 繁體中文
Noise.dat 語(yǔ)言中性
Noise.deu 德語(yǔ)
Noise.eng 英語(yǔ)(英國(guó))
Noise.enu 英語(yǔ)(美國(guó))
Noise.esn 西班牙語(yǔ)
Noise.fra 法語(yǔ)
Noise.ita 意大利語(yǔ)
Noise.jpn 日語(yǔ)
Noise.kor 韓文
Noise.nld 荷蘭語(yǔ)
Noise.sve 瑞典語(yǔ)
在處理全文查詢(xún)時(shí),檢索引擎將滿(mǎn)足檢條件的行的鍵值返回給 Microsoft SQL Server。比如有一個(gè) SciFi 表,其中 Book_No 列是主鍵列。
Book_No Writer Title
-------- ----------- --------------------------
A025 Asimov Foundation's Edge
A027 Asimov Foundation and Empire
C011 Clarke Childhood's End
V109 Verne Mysterious Island
假定想使用一個(gè)全文檢索查詢(xún)來(lái)查找包含單詞 Foundation 的書(shū)名。在本例中,將從全文索引獲得值 A025 和 A027。然后 SQL Server 用這些鍵值和其它欄的信息響應(yīng)該查詢(xún)。
下表顯示了存儲(chǔ)全文索引數(shù)據(jù)所使用的語(yǔ)言。這些語(yǔ)言基于 SQL Server 安裝期間選擇的 Unicode 排序規(guī)則區(qū)域設(shè)置標(biāo)識(shí)符。
Unicode 排序規(guī)則區(qū)域設(shè)置標(biāo)識(shí)符 全文數(shù)據(jù)存儲(chǔ)所用的語(yǔ)言
------------------------------- -----------------------
中文注音符號(hào)(臺(tái)灣) 繁體中文
漢語(yǔ)拼音 簡(jiǎn)體中文
中文筆畫(huà) 簡(jiǎn)體中文
中文筆畫(huà)(臺(tái)灣) 繁體中文
荷蘭語(yǔ) 荷蘭語(yǔ)
英語(yǔ)(英國(guó)) 英語(yǔ)(英國(guó))
法語(yǔ) 法語(yǔ)
通用 Unicode 英語(yǔ)(美國(guó))
德語(yǔ) 德語(yǔ)
德文電話(huà)簿 德語(yǔ)
意大利語(yǔ) 意大利語(yǔ)
日語(yǔ) 日語(yǔ)
日語(yǔ) Unicode 日語(yǔ)
韓文 韓文
韓文 Unicode 韓文
西班牙語(yǔ)(現(xiàn)代) 西班牙語(yǔ)
瑞典/芬蘭語(yǔ) 瑞典語(yǔ)
此列表中沒(méi)有的其它所有 Unicode 排序規(guī)則區(qū)域設(shè)置標(biāo)識(shí)符值都映射到使用空格分隔單詞的中性語(yǔ)言單詞的斷字符和詞干分隔符。
說(shuō)明 Unicode 排序規(guī)則區(qū)域設(shè)置標(biāo)識(shí)符設(shè)置用于所有可進(jìn)行全文索引的數(shù)據(jù)類(lèi)型(如 char、nchar 等)。如果為 char、varchar 或 text 類(lèi)型列的排序次序設(shè)置的語(yǔ)言類(lèi)型,不是 Unicode 排序規(guī)則區(qū)域設(shè)置標(biāo)識(shí)符語(yǔ)言,那么在對(duì) char、varchar 和 text 類(lèi)型的列進(jìn)行全文索引和查詢(xún)時(shí),仍然使用 Unicode 排序規(guī)則區(qū)域設(shè)置標(biāo)識(shí)符值。
創(chuàng)建全文索引(以索引image列為例,其他類(lèi)型字段大致一樣)
標(biāo)題 全文索引image列,全攻略!
作者 pengdali [原作]
關(guān)鍵字 全文索引 image
今天“百年不遇”的停電了,看了一天書(shū)。晚上搞了一下全文索引,決定把心得貼出來(lái),我盡量寫(xiě)的詳細(xì),大家共同學(xué)習(xí),歡迎指正!
1、啟動(dòng) Microsoft Search 服務(wù)
開(kāi)始菜單-->SQL程序組-->服務(wù)管理器-->下拉筐-->Microsoft Search 服務(wù)-->啟動(dòng)它
2、
..\Microsoft SQL Server\MSSQL\FTDATA\SQLServer\Config\目錄里建一個(gè)非空noise.chs文件
非空noise.chs文件,也有人說(shuō)是空的noise.chs文件,但我每次都往里寫(xiě)幾個(gè)沒(méi)用的字母。
3、建立環(huán)境
打開(kāi)查詢(xún)分析器-->執(zhí)行下列腳本:
--------------------------------------------
create database test ---創(chuàng)建test數(shù)據(jù)庫(kù)
use test ---選擇test數(shù)據(jù)庫(kù)
create table dali (ID int not null primary key,MyImage image,FileType varchar(255),FileNmae varchar(255)) ---創(chuàng)建dali表
--dali表中 Id,MyImage,FileType 三列是必須的,因?yàn)橐獙?duì)image列索引的話(huà),必須要有一個(gè)主鍵列,一個(gè)image列,一個(gè)存放文件類(lèi)型的列
--我們知道在windows系統(tǒng)中文件類(lèi)型是靠擴(kuò)展名來(lái)區(qū)分的所以FileType列也就是用來(lái)放 文件的擴(kuò)展名
--------------------------------------------
sp_fulltext_database 'enable' --為全文索引啟用數(shù)據(jù)庫(kù)
sp_fulltext_catalog 'My_FullDir', 'create' ---創(chuàng)建一個(gè)叫My_FullDif的全文目錄
declare @Key sysname ; select @Key=c.name from syscolumns a,sysconstraints b,sysobjects c where a.id=object_id('dali') and a.name='ID' and a.id=b.id and b.constid=c.id and c.name like 'PK%'
exec sp_fulltext_table 'dali','create','My_FullDir',@Key ----這兩句是為全文索引,對(duì)表進(jìn)行標(biāo)記
sp_fulltext_column 'dali','MyImage','add',0x0804,'FileType' ---這句是指定MyImage列為全文索引列,FileType是類(lèi)型列
------------------------------------------------
4、在c盤(pán)下放一個(gè)擴(kuò)展名為doc的word文件,一個(gè)擴(kuò)展名為xls的excel文件,一個(gè)擴(kuò)展名為htm的網(wǎng)頁(yè)文件,個(gè)擴(kuò)展名為bmp的圖片
共4個(gè),大家可根據(jù)實(shí)際情況放入!
5、插入數(shù)據(jù)
建立下面這個(gè)存儲(chǔ)過(guò)程
--------------------------------------------------
CREATE PROCEDURE sp_textcopy
@srvname varchar (30),
@login varchar (30),
@password varchar (30),
@dbname varchar (30),
@tbname varchar (30),
@colname varchar (30),
@filename varchar (30),
@whereclause varchar (40),
@direction char(1)
AS
/* 這是使用textcopy工具將文件插入到數(shù)據(jù)庫(kù)中,如果有前臺(tái)工具可以用前臺(tái)開(kāi)發(fā)工具將文件插入,這里為了演示 */
DECLARE @exec_str varchar (255)
SELECT @exec_str='textcopy /S '+@srvname+' /U '+@login+' /P '+@password+' /D '+@dbname+' /T'+@tbname+' /C '+@colname+' /W"'+@whereclause+'" /F"'+@filename+'" /'+@direction
EXEC master..xp_cmdshell @exec_str
----------------------------------------------------
insert dali values(1,0x,'doc','大力的doc') ---其中第二列是 0x 它是一個(gè)16進(jìn)制數(shù)對(duì)應(yīng)image列,是必須的,不要寫(xiě)null,第三列是文件類(lèi)型,既擴(kuò)展名
sp_textcopy '你的服務(wù)器名','sa','你的密碼','test','dali','MyImage','c:\大力的doc.doc','where ID=1','I'
-------依次參數(shù)是:實(shí)例名,用戶(hù)名,密碼,數(shù)據(jù)庫(kù)名,表名,image列名,路徑及文件名,條件(你必須保證它只選擇一行),I
---------------------------------------------------------------------------------------------------------------------
insert dali values(2,0x,'bmp','圖片')
sp_textcopy '你的服務(wù)器名','sa','你的密碼','test','dali','MyImage','c:\圖片.bmp','where ID=2','I' --注意條件是 ID=2
insert dali values(3,0x,'xls','Excel文件')
sp_textcopy '你的服務(wù)器名','sa','你的密碼','test','dali','MyImage','c:\Excel文件.xls','where ID=3','I' --注意條件是 ID=3
insert dali values(4,0x,'htm','網(wǎng)頁(yè)')
sp_textcopy '你的服務(wù)器名','sa','你的密碼','test','dali','MyImage','c:\網(wǎng)頁(yè).htm','where ID=4','I' --注意條件是 ID=4
----------上面的語(yǔ)句,要保證類(lèi)型一樣,路徑正確,條件唯一正確應(yīng)該就可以了
6、填充全文索引
sp_fulltext_table 'dali','start_full' ---第一個(gè)參數(shù)是表名,第二個(gè)參數(shù)是啟動(dòng)表的全文索引的完全填充
7、可以開(kāi)始你的實(shí)驗(yàn)了
select * from dali where contains(MyImage,'J老師')
select * from dali where contains(MyImage,'海老師')
------END----------
--調(diào)試環(huán)境:SQLServer2000企業(yè)版、Windows2000高級(jí)服務(wù)器
全文索引中的幾個(gè)問(wèn)題:
1.搜索時(shí)出現(xiàn)錯(cuò)誤:
服務(wù)器: 消息 7619,級(jí)別 16,狀態(tài) 1,行 2
查詢(xún)子句只包含被忽略的詞
這種情況修改 \Mssql\Ftdata\Sqlserver\Config 下對(duì)應(yīng)語(yǔ)言的干擾詞列表文件
2.修改了干擾詞文件,查詢(xún)中文時(shí)仍然出現(xiàn)上述問(wèn)題
a.首先檢查你的SQL有沒(méi)有安裝最新的補(bǔ)丁,檢查的方法是在查詢(xún)分析器中運(yùn)行:
select @@version
如果出來(lái)的版本號(hào)是8.00.760以下,則表明你未安裝sp3的補(bǔ)丁,要裝上.
SQL補(bǔ)丁下載:
http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cnFamilyID=9032f608-160a-4537-a2b6-4cb265b80766
注意下載后,執(zhí)行的時(shí)候是解壓,要在解壓后的目錄中執(zhí)行setup.bat才是真正的安裝
b.配置全文索引時(shí),單詞斷字符選擇"中文(中國(guó))"
c.Noise.chs文件中至少有一個(gè)單詞,例如:?
d.如果在全文檢索時(shí),你能正常修改干擾詞文件,說(shuō)明你的全文檢索沒(méi)有使用上這個(gè)文件
如果你配置的全文檢索應(yīng)該要用到這個(gè)文件,那就在
企業(yè)管理器--展開(kāi)你的數(shù)據(jù)庫(kù)--右鍵全文目錄--重建全部全文目錄
3.表中的數(shù)據(jù)改變后,檢索不到
方法1. 右鍵你的表--全文索引表--啟用增量填充
方法2. 右鍵你的表--全文索引表--更改跟蹤,這樣以后的修改會(huì)自動(dòng)填充(有一定延遲)
4.sql2000才支持對(duì)image列的全文檢索
您可能感興趣的文章:- SqlServer 2005 簡(jiǎn)單的全文檢索
- SQL Server全文檢索查詢(xún)淺析
- 全文檢索技術(shù) sql server
- SQL Server 2005 中做全文檢索的方法分享