SQL中的全文檢索

全文索引、查詢和同步化最主要的設計要求是,在註冊進行全文檢索的所有表上都有一個唯一的全文鍵列(或者單列主鍵)。全文索引對使用的重要字及其所在位置進行跟蹤。

例如,假定有一個對 DevTools 表的全文索引。全文索引可能指出在 Abstract 列的第 423 個和第 982 個單詞處找到了單詞 Microsoft,所在的行與 ProductID 6 關聯。該索引結構支持對所有包含被索引單詞的項進行有效檢索,以及高級檢索操作,如短語檢索和鄰近檢索。

爲防止全文索引因包含很多對檢索沒有幫助的詞而變得臃腫,a、and、is 或 the 這類額外的詞都忽略不計。例如,指定"the products ordered during these summer months"與指定"products ordered during summer months"是一樣的。有這兩個字符串的行都會被返回。

目錄 /Mssql/Ftdata/Sqlserver/Config 下提供了多種語言的干擾詞列表。在安裝帶有全文檢索支持的 Microsoft® SQL Server™ 時會創建這個目錄,並同時安裝干擾詞文件。干擾詞文件可以編輯。例如,高技術公司的系統管理員可以把單詞 computer 添加到他們的干擾詞表中去。(如果編輯干擾詞文件,則必須在更改生效之前重新填充全文目錄。)

創建全文索引(以索引image列爲例,其他類型字段大致一樣)

1、啓動 Microsoft Search 服務
   開始菜單-->SQL程序組-->服務管理器-->下拉筐-->Microsoft Search 服務-->啓動它

2、
  ../Microsoft SQL Server/MSSQL/FTDATA/SQLServer/Config/目錄裏建一個非空noise.chs文件
  非空noise.chs文件,也有人說是空的noise.chs文件,但我每次都往裏寫幾個沒用的字母。

3、建立環境
   打開查詢分析器-->執行下列腳本:
--------------------------------------------
create database test ---創建test數據庫
use test             ---選擇test數據庫
create table  dali (ID int not null primary key,MyImage image,FileType varchar(255),FileNmae varchar(255)) ---創建dali表
--dali表中 Id,MyImage,FileType 三列是必須的,因爲要對image列索引的話,必須要有一個主鍵列,一個image列,一個存放文件類型的列
--我們知道在windows系統中文件類型是靠擴展名來區分的所以FileType列也就是用來放 文件的擴展名
--------------------------------------------

sp_fulltext_database 'enable' --爲全文索引啓用數據庫
sp_fulltext_catalog 'My_FullDir', 'create'  ---創建一個叫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  ----這兩句是爲全文索引,對錶進行標記

sp_fulltext_column 'dali','MyImage','add',0x0804,'FileType'  ---這句是指定MyImage列爲全文索引列,FileType是類型列
------------------------------------------------
4、在c盤下放一個擴展名爲doc的word文件,一個擴展名爲xls的excel文件,一個擴展名爲htm的網頁文件,個擴展名爲bmp的圖片
   共4個,大家可根據實際情況放入!

5、插入數據
  建立下面這個存儲過程
--------------------------------------------------
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工具將文件插入到數據庫中,如果有前臺工具可以用前臺開發工具將文件插入,這裏爲了演示 */
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 它是一個16進制數對應image列,是必須的,不要寫null,第三列是文件類型,既擴展名

sp_textcopy '你的服務器名','sa','你的密碼','test','dali','MyImage','c:/大力的doc.doc','where ID=1','I'
-------依次參數是:實例名,用戶名,密碼,數據庫名,表名,image列名,路徑及文件名,條件(你必須保證它只選擇一行),I
---------------------------------------------------------------------------------------------------------------------
insert dali values(2,0x,'bmp','圖片')
sp_textcopy '你的服務器名','sa','你的密碼','test','dali','MyImage','c:/圖片.bmp','where ID=2','I' --注意條件是 ID=2

insert dali values(3,0x,'xls','Excel文件')
sp_textcopy '你的服務器名','sa','你的密碼','test','dali','MyImage','c:/Excel文件.xls','where ID=3','I' --注意條件是 ID=3

insert dali values(4,0x,'htm','網頁')
sp_textcopy '你的服務器名','sa','你的密碼','test','dali','MyImage','c:/網頁.htm','where ID=4','I' --注意條件是 ID=4

----------上面的語句,要保證類型一樣,路徑正確,條件唯一正確應該就可以了

6、填充全文索引

sp_fulltext_table 'dali','start_full' ---第一個參數是表名,第二個參數是啓動表的全文索引的完全填充

7、可以開始你的實驗了

select * from dali where contains(MyImage,'J老師')

select * from dali where contains(MyImage,'海老師')

------END----------
--調試環境:SQLServer2000企業版、Windows2000高級服務器

全文索引中的幾個問題:

1.搜索時出現錯誤:
  服務器: 消息 7619,級別 16,狀態 1,行 2
  查詢子句只包含被忽略的詞

  這種情況修改 /Mssql/Ftdata/Sqlserver/Config 下對應語言的干擾詞列表文件

2.修改了干擾詞文件,查詢中文時仍然出現上述問題
  a.首先檢查你的SQL有沒有安裝最新的補丁,檢查的方法是在查詢分析器中運行:
    select @@version
    如果出來的版本號是8.00.760以下,則表明你未安裝sp3的補丁,要裝上.

    SQL補丁下載:
    http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=9032f608-160a-4537-a2b6-4cb265b80766

    注意下載後,執行的時候是解壓,要在解壓後的目錄中執行setup.bat纔是真正的安裝
 
  b.配置全文索引時,單詞斷字符選擇"中文(中國)"

  c.Noise.chs文件中至少有一個單詞,例如:?

  d.如果在全文檢索時,你能正常修改干擾詞文件,說明你的全文檢索沒有使用上這個文件
    如果你配置的全文檢索應該要用到這個文件,那就在
    企業管理器--展開你的數據庫--右鍵全文目錄--重建全部全文目錄

3.表中的數據改變後,檢索不到
  方法1. 右鍵你的表--全文索引表--啓用增量填充
  方法2. 右鍵你的表--全文索引表--更改跟蹤,這樣以後的修改會自動填充(有一定延遲)

4.sql2000才支持對image列的全文檢索

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章