登陆注册
19122000000015

第15章 SQL Server的全文搜索(2)

返回1表示已安装全文组件,返回0表示未安装全文组件,返回Null表示输入无效或发生错误。

2.为数据库启用全文支持

只有为数据库启用了全文支持,才能进一步设置数据表和数据列。

这里,首先检查一下目标数据库是否已经启用了全文支持。执行下面的SQL语句:

use tianen

select Database Property("tianen","IsFulltext Enabled")

如果该数据库已经启用了全文支持,则返回1;否则返回0。

现在,tianen数据库还没有启用全文支持。执行下面的SQL语句将其启用:

use tianen

Exec sp fulltext database"enable"

3.创建全文目录

在tianen数据库中执行下面的SQL语句,创建一个名为“tianen Catalog”的全文目录作为候选的默认目录。

use tianen

Exec sp fulltext catalog"tianen Catalog","create"

这将在数据库系统表中创建有关全文目录的元数据,并在文检系统中生成空的全文目录。

可以展开企业管理器的tianen节点,单击“全文目录”可以查看到刚创建的tianenCatalog全文目录的情况。

4.注册用于全文检索的表

一个数据库可以包含多个表格,如果要对某个表执行全文检索操作,就要将其注册全文检索。

本例中,tianen数据库中只包含一个表test,将其注册全文检索的方法是执行下面的SQL语句:

use tianen

Exec sp fulltext table"test","create","tianen Catalog","PK test"

这里需要注意的是语句中的第四项,“PK test”是表格test的唯一键。可以在企业管理器中查看和修改。

5.指定用于全文检索的列

一个表格可以包含多个列,如果要对某个列执行全文检索操作,就要将其注册全文检索。本例中,test表格包含四个列,指定title和content列为支持全文检索的列。执行下面的SQL语句:

use tianen

Exec sp fulltext column"test","title","add"

Exec sp fulltext column"test","content","add"

6.激活全文索引

现在全文索引已经创建好了,但是还没有激活,所以不能用。需要将其激活,也就是在全文目录中注册表格。执行下面的SQL语句:

use tianen

Exec sp fulltext table"test","activate"

7.执行全文目录的填充

全文索引激活之后,下面需要对表格中的数据建立索引。这里面涉及数据提取、分词等操作,通过执行下面的SQL语句即可完成这个过程,实现对全文目录的完全填充(因为是第一次填充,所以用完全填充)。这个过程完成之后,就可以使用全文检索了。

use tianen

Exec sp fulltext catalog"tianen Catalog","start full"

全文目录的填充是一种一步操作,一般不会立即创建出索引。而且,创建索引所用的时间取决于表的数据量大小。具有4000000条记录的表的全文索引通常需要几个小时才能填充完成,而具有20000000条记录的表的全文索引往往要用几天才能填充完。

可以通过执行下面的语句来查看全文目录的填充进度:

use tianenselect FulltextCatalogProperty("tianen Catalog","Populate Status")如果全文目录已经填充完成,则返回0;否则返回1或更大的值,表示正处于填充阶段。

返回值为0,证明已经填充完成了。之所以这么快,是因为表格中的数据量非常少。

通常,可以用下面的SQL语句来检查全文目录的填充状态:

WHILE Fulltext Catalog Property("FT pubs","Populate Status")<>0

BEGIN

——如果全文目录正在填充,则等待30秒后再检测一次

WAITFORDELAY"0:0:30′

END

这里,为全文目录请求了完全填充,那么系统会为该目录所涉及的所有表中的所有行生成索引项。如果是为表请求完全填充,就只为该表中的所有行生成索引项。

完全填充通常发生在对数据库表第一次建立全文索引的时候,当执行了这次完全填充之后,再向数据库中添加新记录,新记录并不被建入索引。这时启动增量填充,即可将新记录建入索引,这时也可以用完全填充,但是不经济、浪费资源。执行下面的SQL语句即可启动增量填充:

use tianen

Exec sp fulltext catalog"tianen Catalog","start incremental"

4.3.3体验全文检索

现在,可以享受一下刚才的劳动成果了。

在查询分析器中输入下面的语句,选出在content字段中包含“大禹”这个词的所有记录。

use tianenselect*from test where CONTAINS(content,′"大禹"")

笔者对这个结果非常满意,这并不是因为微软可以实现全文检索(那不算什么,谁都可以做到),而是感慨,“大禹”是中国的上古英雄,微软在做分词的时候可以考虑得这么周全,可见其良苦用心。

尝试一下,在查询分析器中输入以下语句:

use tianen

select*from test whereCONTAINS(common,′"大禹"")

无法执行查询。这就是说,在指定用于全文检索的列的时候,没有被指定的列不支持全文检索。

尝试一下,在查询分析器中输入以下语句:

use tianen

select*from test where common like"%大禹%"

这是用常规的like谓词实现模糊搜索。这说明,在为数据库启用全文检索的时候,常规的检索依然有效。在这个例子中,可以发现用like搜索的速度也很快,这是因为数据表中的数据量很少。

4.4谓词和行集函数

在前面的例子中用到了CONTAINS谓词,它是用于全文检索的两个谓词之一。这一节将介绍SQL Server全文检索的两个谓词CONTAINS和FREETEXT及两个行集函数CONT-AINSTABLE和FREETEXTTABLE的用法。其中,CONTAINS最常用,所以详细讲解,其他的略讲。

4.4.1CONTAINS的用法

CONTAINS谓词用于搜索包含基于字符的数据类型的列,该列于搜索词进行模糊匹配或加权匹配。可以指定的搜索条件包括:

某一列含有某个词;

某一列同时含有某几个词;

某一列含有某个词同时不含有另一个词;

某一列不含有某个词;

某一列含有某个词或另一个词。

不只可以对一列进行搜索,也可以同时对几列进行搜索。

具体的例子如下。

(1)搜索在“content”列中含有“大禹”的记录语句如下:

use tianen

select*from test where CONTAINS(content,′"大禹"")

这里要注意格式,被检索的列在括号的前面,之后是逗号,然后是检索条件,检索条件用半角双引号括起来,外面是半角的单引号。

(2)搜索在“content”列中同时含有“大禹”和“涂山氏”的记录语句如下:

use tianen

select*from test where CONTAINS(content,′"大禹"AND"涂山氏"")

这里使用了AND来连接两个并列的搜索条件,意思是要求被检索的列中同时含有多个检索词。

使用AND可以连接多个并列的搜索条件,例如:

use tianen

select*from test where CONTAINS(content,′"大禹"AND"鲧"AND"水"")

这里使用了AND来连接三个并列的搜索条件,意思是要求被检索的列中同时含有三个检索词:“大禹”,“鲧”,“水”。

(3)搜索在“content”列中含有“大禹”却不含有“涂山氏”的记录语句如下:

use tianen

select*from test where CONTAINS(content,′("大禹")AND NOT("涂山氏")")

这里使用了AND NOT符号来连接两个搜索条件,表示要求被检索的列中含有前面的检索词,而不含有AND NOT后面括号中的词。

(4)搜索在“content”列中不含有“涂山氏”的记录语句如下:

use tianen

select*from test where not CONTAINS(content,′"涂山氏"")

(5)搜索在“content”列中含有“大禹”或“妹喜”的记录语句如下:

use tianen

select*from test where CONTAINS(content,′("大禹")OR("妹喜")")

这里使用了OR符号来连接多个条件,表示“或”的关系。

(6)搜索在“content”列或“title”列中含有“大禹”的记录语句如下:

use tianen

select*from test where CONTAINS(title,′"大禹"")or CONTAINS(content,′"大禹"")

在这里,如果之前对数据表的common列也注册了全文检索,那么想要搜索在“content”列或“title”列或“commont”列中含有“大禹”的记录,就需要用下面的语句:

use tianen

select*from test where CONTAINS(title,′"大禹"")or CONTAINS(content,′"大禹"")or CONTAINS(common,′"大禹"")

这样一来,CONTAINS谓词数量增多,会严重影响搜索的效率。一个常用的解决方案是用“*”来代替列名,“*”代表数据表被注册全文检索的每个列。运行的结果相当于把多个CONTAINS子句并列起来,但效率要高很多。如下面的语句所示:

use tianen

select*from test where CONTAINS(*,′"大禹"")

(7)常规检索谓词的应用

在使用全文检索谓词的时候,原有的常规检索谓词依然有效,如以下语句所示:

use tianen

select*from test where CONTAINS(title,′"大禹"")and common like"%音乐%"

(8)复杂的检索

综合使用AND,AND NOT和OR运算符,以及常规的检索谓词,可以构造出复杂的SQL语句,读者可以根据需要自行解决。这里仅举一例,如下所示:

use tianen

select top2* from test where(CONTAINS(content,′"水"")and id<4)

(9)其他用法

全文检索引擎最早是用于英文的,所以,CONTAINS谓词包含很多对英文的特殊检索功能。英语和汉语有很多不同,比如英语的单词有时态区别,get,got是一个词的不同时态。那么,如果一个人要搜索“get a cheese”,那么在文章中出现了“got a cheese”也算对。SQL Server的全文检索做到了这一点,类似的高级功能还有很多,只是对我们做中文搜索没有太大帮助,这里就不再赘述。

4.4.2FREETEXT的用法

FREETEXT谓词用于搜索包含基于字符的数据类型的列,其中的值符合在搜索条件中所指定文本的含义,但不符合表达方式。使用FREETEXT时,全文检索引擎内部将查询字符串拆分成若干个搜索词,并赋予每个词以不同的加权,然后查找匹配。

比如,在content列中检索:

FREETEXT(content,′"大禹为万民治水"")

这时,检索引擎将首先标识出如下的词语:

大禹、禹万、民、治水、水

然后,这些词语在内部结合到一个查询中,并被赋予适当的加权等级值,然后才执行实际的检索。

尝试一下,执行下面三个搜索。

搜索1:

use tianen

select*from test where content like"%大禹为万民治水%"

这里,使用常规的like搜索,搜索在列中包含“大禹为万民治水”这个词的记录,没有结果。

说明,数据库中并没有这样的记录存在。

搜索2:

use tianen

select*from test whereCONTAINS(content,′"大禹为万民治水"")

这里,使用CONTAINS搜索,调用全文索引,执行全文搜索,还是没有得到结果。这说明CONTAINS忠实地执行了我们的搜索条件。

同类推荐
  • 语文新课标课外必读第三辑——居里夫人传

    语文新课标课外必读第三辑——居里夫人传

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

    课:为学生设计

    本书分析现今课堂教学设计为教师所设计,存在着脱离学生实际,学生主动性不强,缺失有价值的思考,以及对学生持续学习不够重视等问题,提出了课要为学生而设计。本书运用模板化思想,通过大量各学科的运用五星教学设计的模板来引导读者如何改变自己的教学设计。
  • 应用文写作实用教程

    应用文写作实用教程

    应用文写作是高等职业院校普遍开设的一门应用范围广,综合性、实践性都很强的公共基础课,也是一门职业核心能力训练课,更是一门人文素质课。其教学的根本目的,在于使学生了解应用写作基本理论、基础知识,掌握常用应用文体写作的基本写作技能,培养学生更好地与社会融合、更科学地处理好公私事务的能力,以适应当前和今后在学习、生活、工作以及科研中的写作需要。
  • 大学生社会学

    大学生社会学

    胡锦涛总书记指出:经验表明,一个国家坚持什么样的发展观,对这个国家的发展会产生重大影响,不同的发展观往往会导致不同的发展结果。在当今新的时代条件下,应该坚持以人为本,实现全面、协调、可持续的发展。当代大学生作为贯彻和落实科学发展观的重要群体,就是要在实现自身科学发展的同时,实现自我价值,发挥最大作用,实现国家的科学发展,为祖国和人民贡献全部的光和热。
  • 语文新课标课外必读第六辑——亲情故事

    语文新课标课外必读第六辑——亲情故事

    国家教育部颁布了最新《语文课程标准》,统称新课标,对中、小学语文教学指定了阅读书目,对阅读的数量、内容、质量以及速度都提出了明确的要求,这对于提高学生的阅读能力,培养语文素养,陶冶情操,促进学生终身学习和终身可持续发展,对于提高广大人民的文学素养具有极大的意义。
热门推荐
  • 痴情错爱:不许青梅见白头

    痴情错爱:不许青梅见白头

    江悠悠从未想过,那个她曾经爱过的小镇男孩有朝一日竟会成为人中龙凤。那场极其突然的重逢,还有他对她极其突然的爱令江悠悠再次一点一点沦陷。他宠她护她,也对她说过无数遍”我爱你“。江悠悠本以为自己将会成为一个无比幸福的女人,和他长相厮守,白头到老。然而,变故永远令人措手不及。就像他说的:不是不爱你,只是更爱她。
  • 芒炽

    芒炽

    剑与魔法的世界,没有姓氏的少年拿回属于自己的王国。
  • 无敌最强系统

    无敌最强系统

    别人练功升级。楚昭南练功嗑药杀怪,就连挂机都能升级,等级爆炸飙升!别人苦苦炼丹炼器,掌握一门就大喜至极。而楚昭南炼丹炼器制符阵法禁制样样精通,全知全能!管你是什么绝世天才,无上天骄,宗门巨擘,圣地主宰,神朝帝君……凡有不服者,尽皆一概轰杀!
  • 生态文学与文化

    生态文学与文化

    “生态文学”的关键是“生态”。这个限定词的主要含义并不仅仅是指描写生态或描写自然,不是这么简单;而是指这类文学是“生态的”——具备生态思想和生态视角的。在对数千年生态思想和数十年生态文学进行全面考察之后,可以得出这样一种判断:生态思想的核心是生态系统观、整体观和联系观,生态思想以生态系统的平衡、稳定和整体利益为出发点和终极标准,而不是以人类或任何一个物种、任何一个局部的利益为价值判断的最高标准。
  • 激发无限潜能:哈佛教育法

    激发无限潜能:哈佛教育法

    本书以哈佛教育精神为依托,精选了许多感人至深的真实故事和寓意深刻的寓言作品,据此讲述了怎样开发孩子的潜能,培养孩子优秀的品质,教会孩子珍惜自由,让他们更加自信地面对生活,进而直面真实的自己,以及怎样培养孩子的社交能力、学习能力、创新能力和经济能力等影响孩子一生的基本能力。
  • The Grey Brethren

    The Grey Brethren

    本书为公版书,为不受著作权法限制的作家、艺术家及其它人士发布的作品,供广大读者阅读交流。
  • 黑子的剑

    黑子的剑

    如果我有一把剑那剑又悬在天上我会用尽所有力气拿下这把剑黑子的属于黑子的剑为我夺回一切我只要收剑血流
  • 异族恋我的丧尸男友

    异族恋我的丧尸男友

    我们相遇在这乱世,我们经历了许许多多的事,但我从来不会后悔爱上你。。
  • 路边的野花不要采(靡靡之音系列)

    路边的野花不要采(靡靡之音系列)

    [花雨授权]这么优质的好男人,当然要拐回去留着当老公!可是,眼光好的女人不止她一个,怎么可以让他落入别的女人手中?组织起四重声大合唱,天天对着他唱——路边的野花不要采!那要采什么?当然是她这朵公司里的“家花”咯!
  • 回到三年级的时候

    回到三年级的时候

    回到小学时期的他,会怎样重新创造他的人生呢?伴随着成长,路途上的人分分合合,聚聚散散,谁又能陪谁走到最后,没有矛盾,没有对错,是彼此的选择,与信念!