您的位置:首页 > 数据库

SQL中的全文检索

2005-03-25 11:26 239 查看
全文索引、查询和同步化最主要的设计要求是,在注册进行全文检索的所有表上都有一个唯一的全文键列(或者单列主键)。全文索引对使用的重要字及其所在位置进行跟踪。
例如,假定有一个对 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列的全文检索
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: