登陆注册
19122000000016

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

同类推荐
  • 金融企业财务分析

    金融企业财务分析

    金融企业财务是金融企业不可或缺的基础要件。在现代企业制度下,企业的所有者、债权者、经营者和管理者都站在各自的立场上或从各自的利益出发,关注企业的财务状况、经营成果和现金流量,并在有效分析的基础上作出目的性的判断和选择。为了满足市场经济体制和现代企业制度的要求,满足高等院校金融企业财务分析的教与学的需要,我们编写了《金融企业财务分析》。
  • 中小学生综合实践活动-树立科学的人生观

    中小学生综合实践活动-树立科学的人生观

    综合实践活动是现代教育中的个性内容、体验内容和反思内容,与传统教育片面追求教育个体的发展、共性和知识有所不同,综合实践活动提供了一个相对独立的学习生态化空间,学生是这个空间的主导者,学生具有整个活动绝对的支配权和主导权,能够以自我和团队为中心,推动活动的进行。在这个过程中,学生更谋求独立完成整个活动,而不是聆听教诲和听取指导。教师在综合实践活动这个生态化空间里,只是一个绝对的引导者、指导者和旁观者。
  • 中学化学课程资源丛书-化学时空

    中学化学课程资源丛书-化学时空

    作为科学教育的重要组成部分,新的化学课程倡导从学生素质的培养和社会发展的需要出发,发挥学科自身的优势,将科学探究作为课程改革的突破口,激发学生的主动性和创新意识,促使学生积极主动地去学习,使获得化学知识和技能的过程也成为理解化学、进行科学探究、联系社会生活实际和形成科学价值观的过程。本套丛书集知识性与实用性于一体,是学生在学习化学知识及教师在进行引导的过程中不可或缺的一套实用工具书。
  • 管理信息系统分析与设计作业集

    管理信息系统分析与设计作业集

    初学这门课程的学生,教师讲课时能听得懂,但是对知识点掌握不够,为此我们编写了《管理信息系统分析与设计》作业集,概括了教材中所有的知识点,有助于同学们开拓思维。本作业集内容由管理系统中计算机应用概论、企业管理的信息化平台、管理信息系统的开发策略、信息系统规划和可行性研究、系统分析、系统总体设计、系统详细设计、系统实施、系统的管理与维护等组成。各章习题分为:选择题、名词解释和简答题,习题紧扣教材内容。
  • 安全教育六年级(上)

    安全教育六年级(上)

    《安全教育》系列编写的是孩子安全教育的图书。本书主要讲述的是自我保护能力是孩子们快乐健康成长的必备能力。只有学会自我保护,远离危险,我们的孩子才能拥有幸福,享受美好的生活。
热门推荐
  • 我最清浅的念想是爱你

    我最清浅的念想是爱你

    苏语嫣本以为会和她所爱的人过完一生,她淡静的眼睛里恍如有着海洋般深不见底的感情。可谁成想她最轻浅的愿望,便是爱他
  • 踏天至尊

    踏天至尊

    落魄少年觉醒前世记忆,从此鱼跃龙门,逆天崛起,在这个波澜壮阔的大时代逆流而上,终成无敌至尊!
  • 狐女不修仙

    狐女不修仙

    玄幻界的富二代,上古神兽九尾白狐,资质高,出身好,何必苦苦修仙?爱情里的炮灰命,历经天庭争帝,凡间冤案,人间修行何时期满?玄幻悬疑古装轻喜剧正在上演......
  • 一剑浮沉

    一剑浮沉

    悠悠生死别经年!他...来自四大古老修仙家族之首的镜族。天赋异禀、天地异象伴生,却流亡天下、历经磨难。修炼面临大劫如何不疯狂?不疯魔不成魔,危机=机缘。乱世将至、天才云集,一颗新星即将拔地崛起在群星璀璨的夜空中绽放光芒。逆天的身世,加上逆天的修炼天赋,无人能及的智勇,必将书写一段传奇的铁血荣光!
  • 到达不了的终点站

    到达不了的终点站

    几十个爱情故事,全新的故事情节。薄荷的清夏带你体会一篇篇清晰文雅的校园都市生活
  • 萌妃养成记:皇上请接招

    萌妃养成记:皇上请接招

    简直了,薛柒柒怒!这跟男神表白时怎么就穿越了呢?穿越之后,薛柒柒运气很好的捡到一个便宜皇上,此男人颜值逆天,性格高冷,杠杠的男尊级帅哥一枚!但老天似乎看她的小日子过得太滋润了,总喜欢给她找点事干。皇上为她不上早朝真的好么?皇上允许她随意出入御书房真的好么?皇上在她面前用生命来不要脸真的好么?这说好的高冷男尊哪去了?!天!柒柒似乎看见了她与三千后宫心机婊斗智斗勇的未来。
  • 重生:复仇

    重生:复仇

    不可一世的贵族公子,被人暗杀,绝望中带着二十年的超然觉悟重生归来,从此,开始了一段复仇之路生。
  • 城下妖影

    城下妖影

    老师是个妖怪,同班同学被其残害分食,有谁能逃脱?右眼的妖瞳是福是祸?其实一直很爱你,只是对不起,只能化作清风相伴你身边。——书友交流群(346881737)之前用手机码了百万字,那书确实只能算练笔,这书继续用手机码字……如果大家喜欢可以投一票,如果嫌短可以收藏等养肥了再杀,如果不和胃口,衷心谢谢您的点击。星期一、二、三每天一更,星期四、五、六、七每天两更。
  • 年年念念

    年年念念

    有些事错了就是错了,有些人错过就是错过。苏夏躺在床上一字一句地对顾川说:“顾川,你知道吗,陈小周哭并不是因为难过我要嫁给你了,而是因为我没能嫁给那个当初我爱了那么多年的人,她也没能如愿和她用一整个青春爱过的人在一起。她在哭我们曾经的青春,就这样埋葬在了时光里。”那一整个美好的青春里,我们的感情,只能掩埋于心。
  • 梦月蝶妖

    梦月蝶妖

    人人都有自己的宿命,逃不开的。我的宿命只是不同于其他人,我命中注定是劫数,你们无法改变的.