2-5 全文检索技术
u      了解什么是全文检索,全文检索和普通索引的区别是什么
u      熟练掌握配置全文检索服务,了解配置全文检索服务意外处理办法
u      熟练掌握通过CONTAINSFREETEXT谓词进行查询的技巧,可以区分二者之间的差异
u      了解全文检索中降噪词的作用
 
在一个产品介绍网站中查询产品时,由于产品的介绍性文字可能会很长,如果使用对产品介绍字段使用like进行模糊查询,性能肯定会是问题。那么如何解决这个问题呢?第一个想法就是使用全文索引。那么全文索引是什么、应该如何应用、在应用的过程中又应该注意哪些事情呢?
2-5-1 全文检索概述
1. 什么是全文检索
全文索引为在字符串数据中进行复杂的词搜索提供有效支持。全文索引存储关于重要词和这些词在特定列中的位置的信息。全文查询利用这些信息,可快速搜索包含具体某个词或一组词的行。
全文索引包含在全文目录中。每个数据库可以包含一个或多个全文目录。一个目录不能属于多个数据库,而每个目录可以包含一个或多个表的全文索引。一个表只能有一个全文索引,因此每个有全文索引的表只属于一个全文目录。全文目录和索引不存储在它们所属的数据库中。目录和索引由 Microsoft 搜索服务分开管理。全文索引必须在基表上定义,而不能在视图、系统表或临时表上定义。
可以做这样一个比喻。大家大概都见过档案柜,档案柜是将各种档案按照分类登记在档案索引卡上,这个档案柜中的索引卡就象建立的全文索引,通过这些档案索引卡可以迅速定位你要查找的卷宗所在的位置。如果不建立这些索引卡,如果卷宗数量不多还好,一旦档案数量很多的时候显然很难找到期望的卷宗,这就类似使用Like的情形。表2-9所示为全文检索的基本原理。
 

2-5 全文检索技术_技术

2-9 全文检索基本原理
2. 全文检索和普通索引的区别
该区别具体见表2-7所示。
2-7 全文检索和普通索引的区别
普通SQL 索引
全文索引
存储时受定义它们所在的数据库的控制
存储在文件系统中,但通过数据库管理
每个表允许有若干个普通索引
每个表只允许有一个全文索引
当对作为其基础的数据进行插入、更新或删除时,它们会自动更新
将数据添加到全文索引称为填充,全文索引可通过调度或特定请求来请求,也可以在添加新数据时自动发生
不分组
在同一个数据库内分组为一个或多个全文目录
使用SQL Server企业管理器、向导或Transact-SQL语句创建和除去
使用SQL Server企业管理器、向导或存储过程创建、管理和除去
2-5-2 配置全文检索服务实验
1. 系统初始配置
为了实验方便起见,我们选择某个论坛数据库bbs,该数据库中有一张表bbs_ly(留言信息表),该表的属性ly_content为留言内容属性,为本次实验主要进行全文配置的属性。其基本结构见图2-10所示。
首先建立检索表的全文检索,全文检索要求唯一索引,故需要在相关表建立唯一聚集索引。这一步实验可以使用SQL DDL或者SQL Server Management Studio建立表的全文检索,如图2-11所示;或者通过键入命令EXEC SP_FULLTEXT_DATABASE 'Enable'命令达到同样效果。
USE bbs;
EXEC sp_fulltext_database 'enable';
GO

2-5 全文检索技术_检索_02 

2-5 全文检索技术_全文_03 

2-5 全文检索技术_职场_04

 
2-10 ly_content属性为留言内容属性                 2-11 配置bbs_ly 表使用全文索引
2. 定义表的全文检索目录和索引字段
展开该数据库的表,在准备实施全文检索的表上面用鼠标右键通过点击全文检索->定义全文检索将弹出如下执行向导,本向导执行完毕则该表的全文检索业已完毕。如图2-12所示。

2-5 全文检索技术_技术_05

2-12 定义表的全文检索目录和索引字段
3. 定义表的全文检索目录和索引字段
选择要进行全文检索的字段,点击下一步后,出现全文索引向导,一般选择自动执行更改追踪。如图2-13所示。
4. 配置全文索引向导出错的解决方案
下面首先开始出现的是配置全文索引向导,比较容易出现的填充失败情况如图2-14所示。解决的方案是从网上下载SQL Server 2005Sp3补丁,安装后即可以上面的解决问题。
5. 选择或创建新的索引目录
在进行全文检索时候,必须为操作数据库指定索引目录,从而方便定期更新索引和全文目录的文件存储需要,如图2-15所示。
 

2-5 全文检索技术_技术_06

2-13 定义表的全文检索目录和索引字段
 

2-5 全文检索技术_职场_07

2-14 配置全文索引向导出错示意图
 

2-5 全文检索技术_检索_08

2-15 选择或创建新索引目录
6. 新建表计划和新建目录计划
打开定义填充计划窗口,分别新建表计划和新建目录计划,如图2-16所示。
 

2-5 全文检索技术_技术_09

2-16 新建表计划和新建目录计划
7. 新建表计划
首先配置全文索引表计划,在计划类型中选择重复执行,并详细配置执行的频率为每天112128秒执行,无结束日期,点击确定保存,如图2-17所示。
 

2-5 全文检索技术_检索_10

2-17 新建表计划
8. 新建目录计划
其次配置目录计划,配置流程与全文检索表计划相同,如图2-18所示。
 

2-5 全文检索技术_休闲_11

2-18 新建目录计划
9. 新建计划工作结束
配置完全文索引表计划和目录计划后,将在填充计划里面显示计划信息内容,点击下一步继续全文索引的配置工作,如图2-19所示。
 

2-5 全文检索技术_全文_12

2-19 新建计划工作结束
10. 新建计划工作结束
全文索引的配置工作至此完成,系统将显示配置的详细列表信息给DBA。点击完成,全文索引的配置将自动执行索引的配置工作,直至各项全部成功完成为止。如图2-202-21所示。
 

2-5 全文检索技术_休闲_13

2-20 新建计划工作结束
 

2-5 全文检索技术_全文_14

2-21 新建计划工作结束
11. 查询全文检索服务的相关信息
全文索引查询是通过CONTAINSFREETEXT谓词进行查询,下面依次介绍这两个谓词:
q        CONTAINS谓词语法格式:
CONTAINS({column_name|(column_list)|*},‘<contains_search_condition >’)
1:查询包含电脑爱好者的留言内容
select * from bbs_ly where contains(Ly_content,'电脑爱好者')
2:查询包含电脑或者宁海内容的留言
select * from bbs_ly where CONTAINS(Ly_content, '"*电脑*" OR "*宁海*"');
 注意:
    如果关键词仅包括干扰词,则会报如下错误:
    CONTAINS({column_name|(column_list)|*},‘<contains_search_condition >’)
    服务器: 消息 7619,级别 16,状态 1,行 1,全文操作运行失败。查询子句只包含被忽略的词。
小知识:
q         数据库全文检索的降噪词是什么?
全文索引查询是建立在windows操作系统的全文检索基础之上的查询方法,我们经常会使用的搜索文件或文件夹的操作就是基于这个原理。在进行全文检索的时候,检索者会录入一些口语中的一些助词和叹词等,比如中文的“的”等。这些词对于检索信息而言就是噪音,因此windows操作系统就会根据不同的语言,进行降噪处理。这些噪音词就保存在操作系统的降噪文件里面,其文件名是以noise命名,后缀名是具体的国家简拼。如noise.chs就是中文简体降噪词,noise.eng是英文降噪词,noise.jpn是日文降噪词等。
MSSQL2005安装目录 \Mssql\Ftdata\Sqlserver\Config 下提供了多种语言的干扰词列表,如果但缺少了 Noise.chs 这个简体中文的干扰词文件,就会出现无法进行中文全文检索的情况。需要注意的是,在MSSQL2000中,其降噪词文件和操作系统的降噪词文件是相同的,但是在2005版本中改称为noiseCHS.txtnoiseJPN.txt的文件,不论哪种你都可以从其它机器拷贝一份Noise.chs到该目录,并改名为noiseCHS.txt Noise.chs文件可以在本机 winnt\system32录下找到一个同名文件,复制过来更名即可。
q        FREETEXT谓词语法格式:
FREETEXT({column_name|(column_list)|*},'freetext_string'[,LANGUAGE anguage_term])
1:查询包含电脑爱好者的留言内容
SELECT * FROM bbs_ly WHERE FREETEXT (Ly_content, '电脑爱好者' );
 注意:
q         使用 FREETEXT 的全文查询没有使用 CONTAINS 的全文查询精度高,这一点读者可以从检索的结果看出来。