搜索3:
use tianen
select*from test where FREETEXT(content,′"大禹为万民治水"")
这里,使用FREETEXT搜索得到了结果。这说明FREETEXT搜索对原始检索条件进行了拆分和重组。
由此可见,FREETEXT搜索不及CONTAINS搜索精确。然而,这并不是研发者的失误,FREETEXT谓词的出现是建立搜索引擎的需要。如本书第2章所说,搜索引擎的研发者并不能期待执行搜索的用户都懂得搜索语法,而且事实上大部分的用户都不懂得如何搜索。所以,要获得用户想要的搜索结果,就必须猜测用户的想法。FREETEXT在一定程度上做到了这一点。
比如,一个用户搜索“我们是祖国的花朵”,很可能他想搜索的是与“祖国”、“花朵”有关的内容,而并不是要搜索含有“我们是祖国的花朵”这句话的内容。在这个时候,FREETEXT搜索就派上用场了。
4.4.3行集函数的用法
行集函数包括两个:CONTAINSTABLE和FREETEXTTABLE。这两个函数用来指定返回每行的相对排名的全文查询。它们与谓词CONTAINS和FREETEXT很相似,但是用法不同。它们和全文搜索谓词的主要差别如下。
全文搜索谓词都返回TRUE和FALSE值,因此它们一般在SELECT语句的WHERE子句中指定。而行集函数都返回0,1或多行的表,因此它们必须总是在FROM子句中指定。
全文搜索谓词只能用于指定选择条件,SQL Server使用该条件确定结果集的成员资格。行集函数也用来指定选择标准,但是返回的结果表中有一个名为KEY的列,其中包含全文键值。每个全文注册的表都含有这样的列,该列中的值是唯一的,在行集函数返回的表中,KEY列的值是匹配全文搜索条件中所指定的选择条件的行的唯一值。不仅如此,行集函数返回的表中还有名为RANK的一列,其中包含0~1000的值,这些值用来根据返回的行满足选择标准的程度对它们进行排序。
使用行集函数的搜索比使用全文搜索谓词进行搜索要复杂,因为前者返回的是一个行集表,必须与原始的SQL Server表进行显式的联结,之后才能读取出数据。
举一个例子,如果要在数据库中搜索到content列包含“大禹”的记录,用CONTAINS谓词来搜索,使用下面的语句:
use tianen
select*from test whereCONTAINS(content,′"大禹"")
那么,用CONTAINSTABLE行集函数该如何实现相同的功能呢?
如下所示:
use tianen
select*from
testASA
INNER JOIN
CONTAINSTABLE(test,content,′"大禹"")ASB
ON
A.id=B.[KEY]
在这条语句中需要注意以下三点。
CONTAINSTABLE(test,content,′"大禹"")ASB,在CONTAINSTABLE的括号中第一项是表的名称“test”,第二项是被搜索的数据库列“content”,第三项是关键词“大禹”。
将原始表test和CONTAINSTABLE返回的行集表联结起来(这里用的是内联结INNER JOIN,可以根据需要替换成其他联结类型)。
注意联结条件,A.id=B.[KEY]。这里,读者应该记得,在建立全文索引的时候,使用了Exec sp fulltext table"test","create","tianenCatalog","PK test",这里的PK test就是以id作为主键的约束名,所以,在CONTAINSTABLE返回的行集表中,其唯一关键字段KEY和test表的id是等价的。另外,要注意,这里的KEY外面有“[ ]”,这是不可缺少的。
应该注意到,在返回的结果中,包含KEY和RANK两列。
在使用行集函数的时候,模式匹配的方法和使用全文搜索谓词相同。例如:
use tianen
select*from
testASA
INNER JOIN
CONTAINSTABLE(test,*,′"大禹"OR"妹喜"")ASB
ON
A.id=B.[KEY]
可以看到,返回的结果包含三条记录,这三条记录的RANK值分别为:12,74,89。
我们可以在搜索的时候根据RANK值来限定返回的结果数量。如下所示:
use tianen
select*from
testASA
INNER JOIN
CONTAINSTABLE(test,*,′"大禹"OR"妹喜"",2)ASB
ON
A.id=B.[KEY]
只需在CONTAINSTABLE后面的括号中,增加第四项,即可限定返回的结果数量。这里限定数量为2,即返回RANK排列在前面的2条记录。可以看到RANK值为89和74的两条记录返回了,而且是按照RANK值倒序排列。
现在,使用FREETEXTTABLE进行搜索,语句如下:
use tianen
select*from test where FREETEXT(content,′"大禹为万民治水"")
use tianen
select*from
testASA
INNER JOIN
FREETEXTTABLE(test,*,′"大禹为万民治水"")ASB
ON
A.id=B.[KEY]
从查询分析器上看,返回的结果集有两个。
对于行集函数搜索出的结果,还可以通过权值限定法来进一步约束,讲起来会很多,读者可以参考SQL Server的联机丛书进行学习。
4.5全文索引的维护和管理
本节介绍全文索引的维护和管理。当全文索引建好了之后,如何进行查看?如何进行删除?如何停止?如何快捷地实现这些管理?
前面只介绍了建立全文索引的一种方法,本节将完善地讲解与全文索引相关的知识。以SQL Server2000的NorthWind数据库Products表为例。
4.5.1全文索引的创建
创建全文索引的方法有两种。
(1)使用SQL语句
使用SQL语句来创建全文索引的的方法如下:
use Northwind
Exec sp fulltext database"enable"——对数据库启用全文索引
Exec sp fulltext catalog"proCatalog","create"——建立全文目录
Exec sp fulltext table"products","create","proCatalog","PK products"——将表格注册全文目录
Exec sp fulltext column"products","ProductName","add"——注册全文检索列
Exec sp fulltext column"products","QuantityPerUnit","add"——注册全文检索列
(2)使用SQL企业管理器
使用企业管理器来创建全文索引的方法如下。
打开NorthWind数据库,右键单击Products表,在弹出的快捷菜单中依次选择“全文索引表”和“在表上定义全文索引”,为其创建全文目录。
打开“全文索引向导”对话框。然后选择唯一索引。
在“全文索引向导”对话框中,选择需要全文查询条件的列(可以是文本或图像),这里选择ProductName列和QuantityPerUnit列。
单击“下一步”,输入一个新的目录名称“pro Catalog”。
单击“下一步”按钮,选择或创建填充调度。这里,暂时不建立填充调度。
然后单击“下一步”按钮,在对话框中单击“完成”按钮完成全文索引的配置。
最后系统弹出提示信息,单击“确定”,完成创建。
4.5.2填充全文目录
填充全文目录有四种常用方法。
1.完全填充全文目录
完全填充全文目录用在第一次填充的时候,这时数据库已经有很多数据,需要对它们建立一次索引。全文目录的方法有两种。
(1)使用SQL语句
使用SQL语句来完全填充全文目录的方法如下:
use Northwind
Exec sp fulltext catalog"pro Catalog","start full"
(2)使用企业管理器
使用企业管理器来完全填充全文目录的方法如下。
索引建立完成后,可以在“全文目录”里,看到多了一个全文目录“pro Catalog”。右键单击全文目录proCatalog,在弹出的快捷菜单中选择“启动完全填充”。
系统出现“全文目录填充成功启动”提示。
2.增量填充全文目录
当数据库已经有了全文索引的时候,新增加了数据,需要把它们也建入索引,这时可以执行完全填充,但是会耗费很多时间,一个较好的替代方式就是执行增量填充。增量填充全文目录的方法有两种。
(1)使用SQL语句
使用SQL语句来增量填充全文目录的方法如下:
use Northwind
Exec sp fulltext catalog"pro Catalog","start incremental"
(2)使用企业管理器
使用企业管理器来增量填充全文目录的方法如下。
在企业管理器中,右键单击全文目录pro Catalog,在弹出的快捷菜单中选择“启动增量填充”。
系统会出现“全文目录填充成功启动”的提示。
(3)更改跟踪全文目录
更改跟踪全文目录是非常有用的一项功能,它用来跟踪数据库中的数据的改变,数据增加或修改、删除等变化都能被跟踪,然后根据这些变化去相应地修改全文索引。要注意,这项功能并不是实时实现的,从数据被更新到更新索引中间有一段时间的延迟。
在企业管理器中,右键单击“Products”表,在弹出的快捷菜单中依次选择“全文索引表”和“更改跟踪”,即可实现更改跟踪。
(4)在后台更新索引
在后台更新索引,也是一项优化建立索引的方法,用来应付数据频繁更新的情况。
在企业管理器中,右键单击“Products”表,在弹出的快捷菜单中依次选择“全文索引表”和“更新后台中的索引”,即可实现更新索引。
4.5.3全文索引调度
全文索引调度就是让SQL Server按照一定的规则去自动管理全文索引。实现方法如下。
在企业管理器中,右键单击全文目录“pro Catalog”,从弹出的快捷菜单中选择“调度”,在“全文索引调度”对话框中,单击“新建目录调度”按钮,弹出“新全文索引目录调度”对话框。
在该对话框中添加新的调度名称“tianenProduct”,设定作业类型为“增量填充”,调度频率为“反复出现”,时间设定为“每1周在星期日发生,在0:00:00”。
单击“确定”按钮,回到“全文索引调度”对话框,可以看到新建的目录调度。单击“确定”,那么这个调度就建立好了。这个调度使得SQL Server每周星期日0:00:00的时候,对全文目录proCatalog执行一次增量填充。
要删除调度,只需在选择相应的调度后单击“删除”按钮。要编辑调度,在选择相应的调度后单击“编辑”按钮,操作方法和新建调度类似,不赘述。
4.5.4查看全文目录信息
1.查看填充状态
查看填充状态有两种方法。
(1)使用SQL语句
使用SQL语句来查看填充状态的方法如下。
use North Wind
select Fulltext Catalog Property("pro Catalog","Populate Status")
如果全文目录已经填充完成,则状态为“空闲”,返回0;否则返回1或更大的值表示正处于填充阶段。
(2)使用企业管理器
使用企业管理器来查看填充状态的方法如下。
在企业管理器中,右键单击全文目录“proCat-alog”,在弹出的快捷菜单中选择“属性”,打开“全文目录属性”对话框,可以在“状态”选项卡中查看其状态情况。
2.查看表
查看表有两种方法。
(1)使用SQL语句
使用SQL语句来查看表的方法如下:
exec sp help fulltext tables
获得数据库中启用全文检索的所有表格。每个表包含:表的所有者(TABLE OWNER:dbo),表名(TABLE NAME:Products),用于对全文键列施加唯一约束的索引名称(FULLTEXT KEYINDEX NAME:PK Products),用作表的全文键的列的整数标识符(FULLTEXT KEYCOLID:1),表的全文状态(FULLTEXTCATALOG NAME:proCatalog)和表的全文目录名(FULLTEXTCATALOG NAME:pro Catalog)。
(2)使用企业管理器
使用企业管理器来查看表的方法如下。
在企业管理器中,右键单击全文目录“pro Catalog”,在弹出的快捷菜单中选择“属性”,打开“全文目录属性”对话框,可以在“表”选项卡中查看其表情况。