SQL Server 2000 全文检索技术
1 在SQL Server 2000中配置全文检索服务
SQL Server是Microsoft公司在原来和Sybase公司合作的基础上推出的一款面向高端的数据库系统。而SQL Server 2000版本则是最新的、大型
联机事务处理的新型数据库平台。它继承了SQL Server以前版本的一些强大的优势,如简单易用、具有良好的稳定性和高效性等等。同时,它
的功能比以前的版本更加强大,界面更加友好。总之,无论是在功能、安全性、可维护性,还是在易操作性上都较以前版本有了长足的进步。
它的全文检索功能配置简单,使用十分方便。我在建立关于信息检索的英文论文题名、文摘数据库的过程中,使用了SQLServer 2000。由于文
摘文本单词量平均在500个左右,而且论文记录数量较多,如果不为文摘建立全文索引库,将严重影响检索效率。因此,我使用SQL
Server2000的全文检索功能为这个数据库提供了全文检索服务。
1.1 建立全文检索服务的过程如下:
第一步,在SQL Server中建立一个全文数据库English—Data。在该数据库中建立一个表Papers。该表的字段有pa—per__id(代表论文的顺序
,数据类型为int,长度为4,要求非空,并为标知,标知种子为1,自动增量为1)、paperAitle(代表论文的题目,数据类型为vchar,长度为
200,要求非空)、pa—per_abstract(代表论文的文摘,数据类型为vchar,长度为8000,要求非空)。
第二步,为建立全文索引,一定要为该表建立唯一索引(Unique Index)。我为Papers表的paper_id字段建立唯一索引。
第三步,将数据逐步导入到表Papers中。
第四步,打开SQL Server的企业管理器,在左侧的树视中点击数据库。然后点开数据库EnglishData.。选择“全文目录”。点击右键,选择
“新建全文目录”,建立全文目录Paper-AbstractFullSearch,然后建立名称为AbstraetSearch的调度。其他接受默认。
第五步,选择企业管理器的右侧的表Papers,单击右键,选中“全文索引表”,单击“在表上建立全文索引”。将会出现“全文索引向导”窗
口。点击“下一步”会到达“选择索引”窗口。由于本表只有一个唯一索引paper_id,点击“下一步”,会出现“选择表中的列”窗口。选择
“paper_abstract”字段,然后点击“下一步”,出现“选择目录”窗口,接受默认配置,点击“下一步”,出现的窗口“选择或创建填充调
度(可选)”窗口,接受默认配置再点击下一步。出现“正在完成SQL Server全文索引向导”,点击“完成”。完成配置。
第六步,选择表Papers,点击右键,选择“全文索引表”,点击“启动完全填充”,等待完成。
第七步,如果以后对表Papers进行任何的修改(包括添加、删除记录和对原记录进行编辑),都要重复第六步的操作。这一步是为了保证全文索
引库能够与表Papers的修改同步。
以上是建立全文索引的全过程。完成建立后,即可以使用标准的T—SQL语句对其进行全文检索。
3 全文检索语句CONTAINS和FREETEXT的使用
全文检索使用户可以高效检索存储在数据库的char、varchar、text、ntext、nchar、nvarchar等数据类型列中的文本数据。在进行全文检索
之前,应建立和填充数据库全文索引。
3.1 全文索引
为了支持全文索引操作,SQL Server 7.0新增了一些新的存储过程和Transact-SQL语句。使用这些存储过程创建全文索引的具体步骤如下(括
号内为每步所调用的存储过程名称):
(1)启动数据库的全文处理功能(sp_fulltexLdatabase);
(2)建立全文目录(sp_fulhexLcatalog);
(3)在全文目录中注册需要全文索引的表(sp_fulltext table);
(4)指出表中需要全文检索的列名(sp_full—texLeolumn);
(5)为表创建全文索引(sp_fulltexLtable);
(6)填充全文目录(sp_fulltext_catalog)。
下面举例说明:
在本例中,对test数据库book表中title列和notes列建立全文索引。
//首先先启动SQL Server的全文搜索服务。
use test //打开数据库
go
//打开全文索引支持
execute sp_fulltext_database ‘enable’
//建立全文目录ft_pubs
execute sp_fulltext_catalog ‘ft_test’,‘create’
//为titles表建立全文索引数据元,pk_title为book表中由主键所建立的唯一索引,此参数必须。
execute sp_fulltext_table ‘book’,‘create’,‘ft_test’,‘pk_title’
//设置全文索引列名
execute sp_fulltext_eolumn ‘book’,‘title’,‘ add’
execute sp_fulltext_ column ‘book’,‘notes’,‘add’
//建立全文索引
execute sp_fulltexLtable ‘book’,‘activate’
//填充全文索引目录
execute sp_fulltext_ catalog ‘ft_test’,‘start_ full’
go
至此,全文索引建立完毕。
3.2 全文检索
SQL Server 2000提供的全文检索语句主要有CONTAINS和FREETEXT。CONTAINS语句的功能是在表所有列或指定列中搜索:
●一个字或短语;
●一个字或短语的前缀;
●与一个字相近的另一个字;
●一个字的派生字;
●一个重复出现的字。
CONTAINS语句的语法格式为:
CONTAINS({column *}),‘’) 其中,column说明被搜索列,使用时说明对表中所有全文索引列莲行搜索
Contains_ search_ condition说明CONTAINS语句的搜索内容,其语法格式为:
{||| |) [{|ANDIAND NOT|OR}}] [.n]
下面就simple_term和predix_term参数做一简要说明:
simple— term指出CONTAINS语句所搜索的单字或短语,当为一个短语时,必须使用双引号作为定界符。其格式为:
{word | “phrase”}
predix_term说明CONTAINS语句所搜索的字或短语前缀,其格式为:
{“word * ”| “phrase ”}
例如,下面语句检索b0ok表的title列和notes列中包含database或computer字符串的图书名称及其注释信息:
select title,notes from book
where contains(tilte,‘database’)or contains(notes,‘datable’)
or contains(title,‘computer’)or contains(notes,‘computer’)
FREETEXT语句的功能是在一个表的所有列或指定列中搜索一个自由文本格式的字符串,并返回与该字符串匹配的数据行。所以,FREETEXT语句
所执行的功能又称做自由式全文查询。
FREETEXT语句的语法格式为:
FREETEXT({column * },‘freetext_string’)
其中,column说明被搜索列,使用*时说明对表中的所有全文索引列进行搜索。Freetext_string参数指出所搜索的自由文本格式字符串。
例如,下面语句使用FREETEXT语句搜索book表中包含Successful Life字符串的数据行:
select title,notes
from book
where freetext (*,‘Successful Life’)
4 结束语
通过学习和实践,我认为SQLServer2000的全文检索服务有以下优点:
第一,简单易用。由于SQLServer2000的全文检索服务已经集成到整个服务中,因此,全文检索可以使用“企业管理器”进行统一的图形界面
的管理。而且,进行检索时可以使用标准的T—SQL语句,学习、使用十分方便。
第二,SQLServer2000功能强大。比如,其自身具有“噪音词”(noiseterm )过滤的机制。在“.MSSQL\TDATA\SQL Server\config”目录下
,有一个“noise.dat”文件类似于停用词表,可以对一些没有检索意义的词如a、you等进行过滤而不建立索引。用户自己也可以对该词表进
行增补,以过滤一些词。同时,我发现SQLServer2000的全文检索存在一些不足。如当用户对全文索引过的字段进行修改后,需要用户进行手
工的“填充”,而不能机器自动完成这一步,另外该系统对计算机硬件要求较高等等。随着计算机硬件的发展以及SQL Server软件本身的不断
完善,我相信这些不足是可以得到改善的。
------------------------------------------------------------------------------
最简步骤:(以AdventureWorks数据库中的databaselog表中的event字段为例)
1、 启用全文索引:
use AdventureWorks
exec sp_fulltext_database 'enable'
2、 全文索引是存储在指定的文件系统中的,而不是SQLServer中。
exec sp_fulltext_catalog 'Cat_Desc', 'create', 'f:/ft'
创建全文索引的目录
3、 对表创建全文索引
exec sp_fulltext_table 'databaselog', 'create', 'Cat_Desc','PK_DatabaseLog_DatabaseLogID'
在已有的表上根据已有的索引创建全文索引
4、 对表中的列添加全文索引
exec sp_fulltext_column 'databaselog', 'event', 'add'
5、 表启动完全填充
exec sp_fulltext_table 'databaselog', 'start_full'
6、 执行全文检索
select * from freetexttable(databaselog, event,'ALTER_TABLE');