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

同类推荐
  • 保育员

    保育员

    初级保育员理解托幼机构保育工作的意义,了解保育员的任职要求,明确在托幼机构中保育员的基本职责。中级保育员了解托幼机构保育工作的主要内容,理解托幼机构中保育工作的意义和任务,明确托幼机构中保育员的职责。高级保育员掌握托幼机构保育工作的基本原则,掌握托幼机构保育工作的主要内容和基本要求,明确托幼机构中保育员的职责。
  • 中学文科课程资源-诗中水

    中学文科课程资源-诗中水

    诗词是阐述心灵的文学艺术,而诗人、词人则需要掌握成熟的艺术技巧,并按照严格韵律要求,用凝练的语言、绵密的章法、充沛的情感以及丰富的意象来高度集中地表现社会生活和人类精神世界。中国诗起源于先秦,鼎盛于唐代。中国词起源于隋唐,流行于宋代。
  • 语文新课标课外必读第十二辑——王子与贫儿

    语文新课标课外必读第十二辑——王子与贫儿

    国家教育部颁布了最新《语文课程标准》,统称新课标,对中、小学语文教学指定了阅读书目,对阅读的数量、内容、质量以及速度都提出了明确的要求,这对于提高学生的阅读能力,培养语文素养,陶冶情操,促进学生终身学习和终身可持续发展,对于提高广大人民的文学素养具有极大的意义。
  • 语文新课标课外必读第十一辑——中外哲理美文精选

    语文新课标课外必读第十一辑——中外哲理美文精选

    本书精选了数百篇极具思想价值的哲理美文,呈现了大师们的深刻人生感悟,使读者感受到文化的熏陶和人文的关怀。
  • 学生素质教育丛书-学生行为规范读本

    学生素质教育丛书-学生行为规范读本

    本套丛书共分为:美育教育读本,在五星红旗下成长,学生素质培养读本,启智教育读本,学生行为规范读本,艰苦奋斗教育读本,传统美德教育读本,禁毒教育读本,家长学校读本,英雄主义教育读本。针对学生素质教育面临的重要问题,详细地论述了学生综合素质教育的基本内容。
热门推荐
  • 腹黑萌宝总裁敢要吗

    腹黑萌宝总裁敢要吗

    “想当我爹地,可以,排队,给钱!”萌宝眯着眼,瞧这眼前的男人。某男脸黑了,“你妈呢,我的亿万身价全送给你。”——————————“女人逃了我六年还敢把我的孩子给拐走了,我太把你宠的无法无天了是吧!”“身下留人。”某萌宝来解救自个儿的妈咪。“妈咪,好感动哟!”某个没良心的女人两眼泪汪汪。“小子,亿万不要了”某男威胁到道。“对不起妈咪,本宝宝去也!”说着轻飘飘的走了。货真价实,假一赔十本文绝宠,绝宠的
  • 位面霸主系统

    位面霸主系统

    一道闪电改变了命运的轨迹,,你以为这是系统流?太天真!科技修炼当科技与修真的碰撞,会擦出什么样的场景
  • 终极狂魔

    终极狂魔

    作为一个从21世纪莫名穿越的人来说,天影就是他在天命大陆上的名字。他没有野心,不想成就什么宏图霸业,唯一的要求就是在天命大陆这个陌生的世界好好地活下去,但是这么简单的要求他也没有办法去实现...
  • 一生的财富(智慧生存丛书)

    一生的财富(智慧生存丛书)

    财富之本并不是人人都有,内外兼修,是获取财富的路径,青少年必须要知道的理财知识。
  • 芷兰传

    芷兰传

    满城尽繁华,孤院独凄凉......
  • 欢迎来到无限世界

    欢迎来到无限世界

    《我的世界》居然开放了一个百万人服务器?这必须得去抢一个内测名额啊,但是……为什么会是自己直接进入到游戏里面。而且出生地特么的居然是沙漠,沙漠啊混淡!天赋和新手奖励都毫无卵用的石峰小少年要如何用他的机智走出沙漠?请关注荒野……呃,《欢迎来到无限世界》轻松愉快地赚钱、打怪、建房子,然后努力赚够点数回现实世界去吧~
  • 龙九年代

    龙九年代

    京城某一世家的产房里诞生了一名婴儿,世家守护者预言他将重振风雨飘摇的世家,同时改变京城和华夏的格局...龙九是城中村里的房东,漂亮的女租客接踵而至,同时麻烦不断。他通过摆夜市、收房租而生,但赚得的钱却捐给福利院和希望工程。龙九好色、猥琐,但也仗义、有爱心...《御龙诀》使龙九的的力量、身体强度、速度等等都得到提升,世俗界、古武界必将被搅的天翻地覆。他必定是人上人!!!!!!
  • 源起华夏

    源起华夏

    夏朝到底存在吗?所谓的劫运又是什么?截阐之争到底在争些什么?炎黄之前还有什么?大秦为何如此之神秘?圣人?域外?洪荒?大秦?练气士?求仙问道,这一切的原因,在这个世界,我们将来寻找答案。“有私,生息轮回者为生;知我,可行逆天者为灵。”生当为灵,应行逆天之道,修万法,通万物。纳天地正气,修君子之道,谋世间万物,道源起华夏。本文有点诙谐,有点严肃,有点搞笑,有点认真,一叶拙作,供各位看官欣赏!写这本书除了生活所迫,还有就是受到一些道教文化的影响,想要把道教的那些修行,道教的秘典,传说的那种感觉写出来,不过一叶文笔可能驾驭不了,所以还请各位看官见谅了。
  • 再次相遇,丫头,我还爱着你

    再次相遇,丫头,我还爱着你

    她,凌飞妮,本想好好的度过她的大学生活,可老天爷偏偏不如她愿,先是初吻被抢,失被恶魔缠上,然后又得知自己是捡来的,好不容易找到亲生父母,又与男朋友的家人是世敌……
  • 帝术

    帝术

    他是一个无敌的帝者,肩上担负着一个未知的沉重使命!一个个才貌双全的绝世女子与他不期而遇!是命运的牵连,还是轮回的宿命使然?他立志做一个有品位的极品色狼。与其坐拥天下,亦不如醉卧美人膝!未知的奇异旅途让他领略了大千世界的千奇百怪,美轮美奂!过去、现在、未来,哪里才是他最终的归宿?其实,他只想泡尽天下美女!--------------------------------------------------------------------------------求收藏,求推荐!新人写书,只能循序渐进,一步一个台阶,进步只在那字里行间!