本章要点
本章介绍基于SQL Server数据库的全文搜索技术,内容包括SQL Server全文搜索的原理、全文索引和搜索的实现,以及大数据的全文搜索优化。
4.1SQL Server简介
SQL Server是使用客户-服务器(C/S)体系结构的关系型数据库管理系统(Relational Database Management System,RDBMS)。1988年推出了第一个OS/2版本。1992年,SQLServer移植到NT上后,Microsoft成了这个项目的主导者。1994年以后,Microsoft专注于开发、推广SQL Server的WindowsNT版本。1996年,Microsoft公司推出了SQL Server6.5版本。1998年,推出了SQL Server7.0版本。2000年推出了SQL Server2000,2006年推出了SQL Server2005。
SQL Server2000提供了完善的图形化用户界面、丰富的编程接口工具,而且与WindowsNT完全集成,具有很好的伸缩性。它对Web技术提供良好支持并且提供数据仓库功能。
4.2SQL Server全文检索的基础知识
主流的数据库都提供了对于数据库中内容的全文索引和全文检索服务,利用这项服务可以对数据库中的大量信息实现迅速的模糊搜索。本章以及后面两章介绍基于世界最常用的三种数据库的全文检索技术,这些知识可以用于解决100万条数据以内的实际全文检索问题。
本章专门介绍SQL Server2000的全文搜索技术。
4.2.1Microsoft搜索服务简介
SQL Server自7.0版本起,支持全文检索功能,而且这项功能十分完善,对中文的支持也很好。这项功能到了SQL Server2000版本更加完善,在企业版(Enterprise Edition)和标准版(Standard Edition)中包含,个人版(Personal Edition)和开发版(Developer Edition)中没有。如果用户能在SQL Server的企业管理器中找到那个绿色的小箭头图标,就说明其SQL Server服务器支持全文检索。
本书使用的是SQL Server2000企业版。
SQL Server2000全文检索组件支持在字符串列上进行复杂的搜索,该功能由Microsoft搜索服务(Microsoft Search)实现,它之所以能实现全文检索,在于有两项重要的支持:索引支持和查询支持。前者用来建立索引,后者用来接收用户的查询条件,从索引中检索数据。
Microsoft搜索服务是一个全文索引和搜索引擎,它对索引的支持表现在它能为数据库定义全文目录和索引,接受全文目录及各目录中组成索引的表和列的定义,并填充全文索引。它能支持全文查询,确定索引中满足全文搜索条件的项,对于满足条件的每一项,它向MsSQLServer服务返回行标识和一个等级值,然后MsSQL Server服务使用这些信息构造查询结果集。
Microsoft搜索服务在本地系统账户的环境中运行。在安装过程中,SQL Server将自己添加为一个Microsoft搜索服务管理员。
全文目录和索引不存储在SQL Server数据库内,而是存储在Microsoft搜索服务单独管理的文件中。只有Microsoft搜索服务管理员和计算机系统管理员才能访问全文目录文件。
4.2.2Microsoft搜索服务对全文查询的支持
在执行全文查询的时候,不是使用like谓词,而是用新的、专用于全文检索的谓词和行集函数。
包括CONTAINS和FREETEXT谓词,以及CONTAINSTABLE和FREETEXTTABLE行集函数。
这些新谓词和行集函数可以统称为全文结构。含有全文结构的SQL语句传递到数据库中之后,全文提供程序就会使Microsoft搜索服务检索所需的信息。
整个检索的过程如下。
①用户通过应用程序给SQL Server实例发送带有全文结构的SQL语句。
②SQL Server关系引擎通过查询系统表来验证全文结构,然后将每个SQL语句简化为一系列行集操作,并通过OLEDB将这些操作传递给基础组件,通常是存储引擎。SQL Server关系引擎再通过全文提供程序将全文构造转换成对行集的请求。
③全文提供程序验证行集请求,然后将搜索条件变换为Microsoft搜索服务的查询组件能支持的形式,并将其发送给Microsoft搜索服务。
④Microsoft搜索服务查询组件从全文索引中提取所请求的数据,然后以行集的形式将这些数据回传给全文提供程序。
⑤全文提供程序将行集返回给关系引擎。
⑥关系引擎将它从存储引擎和从全文提供程序收到所有行集进行组合,返回给应用程序,然后显示给用户。
4.2.3Microsoft搜索服务对全文索引的支持
在SQL Server数据库中,文本数据是存储在char,varchar,text,ntext,nchar,nvarchar类型的数据列中的。常规方法检索这一类数据是很烦琐的,而且数据库在处理长文本数据时很容易出错。
全文查询是依赖于全文索引的,要首先建立好索引,然后才能执行查询。SQL Server全文检索服务可以建立全文索引,并且在后台更新索引,这样一来,填充或更新索引就不影响其他任务的执行。用户可以完全重建索引、增量重建索引、删除索引,对索引实现良好的管理。
而且,对于image列中存储的某些类型的数据也可以进行索引和检索,这包括.doc,.xls,.ppt,.txt和.htm等类型。设计表时,除包括保存数据的image列外,还需增加一个绑定列来保存存储在image列中的数据的格式,通常保存扩展名或MIME类型。
如果想让某一列数据允许执行全文检索,就要在这一列上注册全文检索。当全文注册列中的值更新时,或者这一列新添加了数据,或者这一列中的某一行被删除的时候,全文索引不会立即修改,而是被异步重新填充,这主要是由于以下两个原因:一般更新全文索引比更新标准索引所需的时间要多得多,耗费的系统资源也多。
全文检索的结果没有常规检索精确,这是它的弱点,也是特性。没有必要实时更新全文索引。
全文索引与普通的索引有很大的不同,它的实现方式读者可以参考第二章的相关内容去理解。全文索引事先分好了关键词,并计算出记录相对于关键词的等级(Rank),这样使得检索速度大大加快了。
4.2.4Microsoft搜索服务的全文管理
1.全文管理的层次
全文索引和普通索引的差异使大量管理任务变得不可缺少。全文管理是在几个层次上实施的,包括:服务器、数据库、全文目录、表和列。详情如下。
(1)服务器
可以对服务器范围的某些属性(如resource usage)加以设置,以便增加或减少全文服务所使用的系统资源数量。
说明:全文引擎作为名为Microsoft搜索的服务在Microsoft WindowsNT Server和Microsoft Windows2000Server上运行。对于Microsoft SQL Server个人版,Microsoft搜索服务不可用。尽管这意味着Microsoft搜索服务既未安装在Microsoft Windows95/98上,也未安装在Windows NT工作站或Windows2000 Professional客户端上,但这些客户端在连接到SQL Server标准版安装或企业版实例时就可以使用这项服务。
(2)数据库
必须启用数据库才能使用全文服务。可以在已启用的数据库中创建和除去一个或多个全文目录的元数据。
(3)全文目录
全文目录包含数据库中的全文索引。每个目录可以用于数据库内的一个或多个表的索引需求。该目录中的索引是使用这里介绍的管理功能来填充的。(全文目录必须驻留在与SQLServer实例相关联的本地硬盘驱动器上。不支持可移动的驱动器、软盘和网络驱动器)。在每个服务器上最多可创建256个全文目录。
说明:Windows NT故障转移群集环境完全支持全文索引。
(4)表
首先,必须为全文支持启用表。然后,为与该表相关联的全文索引创建元数据(如表名及其全文目录)。表启用后,可以用为全文支持而启用的列中的数据来填充它。如果表的全文定义被更改(例如,添加一个也将为全文检索而索引的新列),则必须重新填充相关的全文目录以使全文索引与新的全文定义同步。
(5)列
可以从非活动的全文注册的表中添加或除去支持全文查询的列。
在所有这些级别上,可使用工具检索元数据和状态信息。
与常规SQL索引一样,当在相关表中修改数据时,可自动更新全文索引。或者,也可用适当的间隔手工重新填充全文索引。这种重写可能既耗时又大量占用资源,因此,在数据库活动较少时,这通常是在后台运行的异步进程。
应将具有相同更新特性的表(如更改少的与更改多的,或在一天的特定时段内频繁更改的表)组合在一起,并分配给相同的全文目录。通过以此方法设置全文目录填充调度,使得全文索引和表保持同步,且在数据库活动较多时不对数据库服务器的资源使用产生负面影响。
2.为全文目录指定表的基本原则
为全文目录中的表安排全文索引的位置是非常重要的。在为全文目录指定表时,应该注意下列基本原则。
始终选择可用于全文唯一键的最小唯一索引(4个字节且基于整数的索引是最佳的)。
这将显着减少文件系统中Microsoft搜索服务所需要的资源。如果主键很大(超过100字节),可以考虑选择表中其他唯一索引(或创建另一个唯一索引)作为全文唯一键;否则,如果全文唯一键的大小达到允许的上限(450字节),全文填充将无法继续进行。
如果进行索引的表有成千上万行,请将该表指定给其自己的全文目录。
应该考虑对其进行全文索引的表中发生的更改数及表的行数。如果要更改的总行数,加上上次全文填充期间表中出现的行数达到成千上万行,请将该表指定给其自己的全文目录。
全文索引为在字符串数据中进行复杂的词搜索提供有效支持。全文索引存储关于重要词和这些词在特定列中的位置的信息。全文查询利用这些信息,可快速搜索包含具体某个词或一组词的行。
3.注意事项
全文索引包含在全文目录中。
每个数据库可以包含一个或多个全文目录。一个目录不能属于多个数据库,而每个目录可以包含一个或多个表的全文索引。
一个表只能有一个全文索引,因此每个有全文索引的表只属于一个全文目录。
全文目录和索引不存储在它们所属的数据库中,目录和索引由Microsoft搜索服务分开管理。
全文索引必须在基表上定义,而不能在视图、系统表或临时表上定义。
4.3启用SQL Server全文检索
本节实现一个基于SQL Server全文检索的百万记录的全文搜索引擎。
4.3.1建立测试数据库
建立一个数据库,名为tianen,数据库中只含有一个表格,名为test。这是一个存储文章的表格,包含四个字段:id是int类型自动增长列,作为主键;title是varchar(50)类型,用来存储文章标题;content是text类型,存储文章内容;common是varchar(50)类型,用于存储文章的其他信息。
4.3.2启用全文检索
在建立了数据库并输入测试数据之后,下面对刚才建立的数据表启用全文检索;步骤如下所示。
1.启动Microsoft搜索服务
有三种方法可以用来启动Microsoft搜索服务。
①进入SQL Server企业管理器,用鼠标右键单击“全文检索”节点,在弹出的快捷菜单中选择“启动”。如果当前图标为绿色,说明已经启动;如果是红色,则为停止,应启动。
②进入SQL Server服务管理器,“服务”中选择“Microsoft Search”,并单击“开始/继续”按钮。
③在“运行”对话框中直接输入命令“net start mssearch”,即可启动Microsoft搜索服务,使用“net stop mssearch”命令可以停止Microsoft搜索服务。
当然,在启动全文检索之前,需要先看看计算机上是否已经安装了全文检索组件。如果计算机上恰好没有企业管理器,那么就没办法“目测”了。可以通过储存过程FULLTEXTSER-VICEPROPERTY(返回有关全文服务级别属性的信息)来验证搜索服务(全文组件)是否安装。执行下面的语句:
use tianen
Select fulltextserviceproperty("IsFullTextInstalled")