登陆注册
7538600000016

第16章 SQL Server的全文搜索(3)

搜索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”,在弹出的快捷菜单中选择“属性”,打开“全文目录属性”对话框,可以在“表”选项卡中查看其表情况。

同类推荐
  • 温暖的故事--盛开在掌心的茧花儿

    温暖的故事--盛开在掌心的茧花儿

    本书是一本集爱情、亲情、友情以及陌生人之间真诚相助的故事书。在这本书中,《打死不说我爱你》会告诉你什么是人世间最温暖的爱情;《蝴蝶之家》会告诉你每一双手的相握,都会让世界多一份暖暖的爱意;《你就是那最美的栀子花》和《请到天堂门口来接我》则会告诉你,心有阳光,无论再困窘的生活都会充盈着快乐与幸福。
  • 这样写作最高效

    这样写作最高效

    本书是一部专门针对中、高考作文的训练书,旨在帮助中学生在限定的时间内快速、准确、高效地写出好作文,在考试中获得高分。本书在内容上紧扣考试大纲要求,准确地把握考试内容;在形式上紧跟中、高考话题文的发展趋势,取材典型,重点突出,是中学生理想的作文训练教材。
  • 学校文娱演出活动的策划(上)

    学校文娱演出活动的策划(上)

    文化的内涵非常丰富,其本义则是“以文教化”,表示对人的性情的陶冶,品德的教养,属于精神领域的范畴。所以,我们学习文化知识,就是为了不断提高个人的文化素质修养。
  • 电子政务应用趋势与实践创新

    电子政务应用趋势与实践创新

    本书是作者基于多年的电子政务工作实践凝练而成,主要涉及电子政务的基础理论和应用实践两个方面。帮助读者从概念层面、技术层面到实践层面全面把握电子政务的理论知识及应用技术。全书共分8章,第1章至第5章为基础篇,分别介绍了电子政务的基础理论、电子政务与政府管理创新、国内外电子政务的发展、电子政务的信息技术支撑和电子政务的安全保障;第6章至第8章为应用篇,分别介绍了电子政务办公自动化系统、电子政务门户网站和电子政务信息资源系统的规划、设计、建设和利用。为紧密结合十七届六中全会精神的要求,本书对当前网络文化建设、网络问政实施、网络新媒体应对及网络舆情引导等热点问题进行了深入地阐释。
  • 大学语文

    大学语文

    《大学语文》主要分为“口语交际”“阅读理解”"书面表达”“应用写作”等。
热门推荐
  • 落雪塞

    落雪塞

    所谓喜欢,也许是第一眼,也许是许多年。落雪塞,兰煌城,回雁山……我看着雪原上的寒风与城墙上的烽烟来回辗转。我才发现,晋语,原来,你想要的,这么多,你承受过了,这样多。我就这样突兀地走进你的故事。“你知道吗,晋语,很多时候我在想,如果我从来不曾出现在你的生命里,很多事情,会不会不一样?”“不会。”他的手臂依旧环得很紧,将我紧紧地贴在他的胸口上:“你如果不存在,该发生的一切依旧会发生,只是,我不会快乐。”你知道吗小枝,这个世界上除了你,已经没有什么让我快乐的了。所以,留在我的身边吧。很久以后,在一个星子寥落的夜晚,我轻轻闭上双眼。我还记得那年冬日,那座莽莽苍苍的雪原,那个沉默的少年。
  • 檐下wx肖战

    檐下wx肖战

    哪怕是房梁和屋檐把生活压得再低,但我还是觉得有另一片天空的希望。何况同一片天空下,同一个屋檐里还有你!~肖战
  • 半魔使者

    半魔使者

    本来能够继承贵族衣钵衣食无忧,谁知被王室夺去贵族头衔。为拿回属于自己的尊严,猪脚愤而走向夺爵之路……不小心召唤出魔女作为自己的使魔……拥有天使能力,却是恶魔的灵魂……且看猪脚如何夺回尊严,平定天地人魔三界
  • 花开半夏十里悠长

    花开半夏十里悠长

    作者的个人经历和简约随笔感悟,大多数为游记情感表达
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!
  • 倾城懒妃凤霸天下

    倾城懒妃凤霸天下

    她冰冷,她懒散。他冷漠,他无情。一场意外,一场穿越。圣旨到,她成了他的王妃。收敛锋芒的她,冷漠无情的她,慵懒随性的她…哪个都是她。两人相遇,磁场相同,同极相斥。水火不容的两人,渐渐被吸引,两颗冰冷的心,渐渐被融化…
  • 宇航异界行

    宇航异界行

    战争,悲剧在上演!安逸的生活让人们失去了对战争的恐惧,代替的是战后的利益。然而他们不知道战争正是最大的损失。当战火蔓延到他们眼前,他们实实在在的感受到了战争的可怕的时候,终于他们开始忏悔了,遗忘历史本身就是一种悲剧。
  • 重生斗罗之万始至尊

    重生斗罗之万始至尊

    现代人林玄重生在斗罗大陆,刚觉醒武魂就先天20级,双生武魂,诛仙四剑,麒麟。魂环全部万年以上。什么唐三唐昊,干就完了!
  • 网瘾少女错穿日常

    网瘾少女错穿日常

    身与魂穿,慕阮表示自己自带锦鲤体质。穿越第一天,她被尊贵的陛下推出来当了不想立后的挡箭牌。一句皇后喜静,她被万千眼刀杀了个片甲不留。自此,原本打架怼人样样在行的她被肆无忌惮的偏爱宠成了十指不沾阳春水的娇娇女。大婚之日,十里红妆,她难得呆了一次,“我不是你不想立后的挡箭牌吗?”“就算是,那也是一辈子。”