Sql2005 全文索引(五)

本文介绍如何在SQL Server 2005中利用全文搜索技术进行高效的数据查询,涵盖全文索引创建、管理及多种搜索方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

實戰篇(續)  

(7)使用全文搜索查询

设置完全文索引并填充完毕之后,就可以通过全文搜索来查询数据了。使用全文搜索来查询数据所用到的 T-SQL 语句也是 SELECT 语句,只是在设置查询条件时和前面所说过的 SELECT 语句的查询条件设置有些不同。在 T-SQL 语言中,可以在 SELECT 语句的 WHERE 子句里设置全文搜索的查询条件,也可以在 FROM 子句里设置查询条件,此时将返回结果作为 FROM 子句中的表格来使用。

如果要在 WHERE 子句里设置全文搜索的查询条件,可以使用 CONTAINS FREETEXT 两个谓词;如果要在 FROM 子句里设置全文搜索的查询条件 ,可以使用 CONTAINSTABLE FREETEXTTABLE 两个行集值函数.

(7.1)使用 CONTAINS 搜索

CONTAINS 用于 SELECT 语句的 WHERE 子句中,可以支持使用复杂的语法在字符列中搜索词、子句、衍生字或位置相近的字符串。使用 CONTAINS 谓词可以在数据表中使用以下五种形式搜索数据:

简单词:也就是可以搜索一个或多个特定的词或短语。词可以包括一个或多个字符,中间没有空格或标点。短语可以是由空格分隔的多个词组成,但词之间可以有标点也可以没标点。

派生词:也就是可以搜索特定词的变形,一般是指英语中的单词,其有过去式、现在式、将来式等不同的形式。派生词是指可以包含该单词的所有其他形式。

前缀词:也就是可以搜索指定文本开头的词或短语。一般也用于英文单词中,可以指定一个英文单词的前几个字母来作为搜索条件。

加权词:也就是可以给多个搜索条件加上权值,加权值越高的记录排在越前面。

邻近词:也就是可以搜索与另一个词或短语相邻近的词或短语。

下面分别介绍如何使用这些不同的方式来搜索数据  

CONTAINS 具體語法請參考聯機幫助!

(7.1.1)简单词的搜索方式

简单词的搜索方式就是搜索一个或多个特定的词或短语。

例一、搜索文章表的标题中含有 上海 的记录,其代码如下:

SELECT * FROM 文章 WHERE CONTAINS( 标题 ,' 上海 ')

例二、搜索文章表的内容中含有 上海 广州 的记录,其代码如下:

SELECT * FROM 文章 WHERE CONTAINS( 内容 ,' " 上海 " OR " 广州 "')

注意例二与例一的不同,在 CONTAINS 谓词的第二个参数里,将 “” 上海 ” OR “ 广州 ”” 做为一个字符串传递 CONTAINS 。使用以下代码将会出错: SELECT * FROM 文章   WHERE CONTAINS( 内容 ,' 上海 ‘ OR  ’ 广州 ')

 (7.1.2)派生词的搜索方式

派生词的搜索方式主要用在英文当中,因为英文单词中含有现在式、过去式、将来式、单复数等不同的形式,使派生词的搜索方式可以将字段中包括该单词的所有形式的记录都搜索出来。例如使用派生词方式搜索包含单词 download 的记录,则会把包含 download downloading 等派生词的记录都搜索出来。

例三、搜索文章表中内容中含有 download 及其派生词的记录,其代码如下:

SELECT * FROM 文章 WHERE CONTAINS( 内容 ,'FORMSOF(INFLECTIONAL,download)')

注意 CONTAINS 谓词的不同处,运行结果如图7.1 所示   

 7.1運行結果 7.1運行結果

在图7.1 中可以看到只查询到一条记录,而并未将 download 的派生词也搜索进来,这是因为从一开始设置全文索引时,所采用的是数据库默认的断字符语言,即简体中文,而在中文中没有派生词,所以使用派生词方式搜索数据是起不到其作用的。此时可以通过修改全文索引的断字符语言来达到搜索效果。修改方式如下:

1 )右击全文索引所在的数据表,在弹出的快捷菜单中选择【全文索引】-- 【属性】-- 【全文索引属性】对话框。

2 )在【全文索引属性】对话框里选择【列】选项,弹出如图7.2 所示对话框,修改【内容】字段的【断字符语言】为 “English”

7.2 修改断字符语言 7.2 修改断字符语言

3 )单击【确定】按钮完成操作。

再次运行例三中的代码,其运行结果如图 7.3 所示。

 7.3正确的运行结果 7.3正确的运行结果

(7.1.3) 前缀词的搜索方式

前缀词的搜索方式主要也是用在搜索英文中,例如搜索以 “do” 开头的单词,则可以将 doctor document download 等单词都搜索出来。

例四、搜索文章表中内容中含有 “do” 开头的单词的记录,其代码如下:

SELECT * FROM 文章 WHERE CONTAINS( 内容 ,' "do*" ')

此方式有点类似与 like 子句的通配符方式,但只能使用 “*” ,并且只能放在英文字母之后,如 “*do” “*do*” 都是错误的表达方式。

(7.1.4) 加权词的搜索方式

当以多个字符串作为搜索条件搜索记录时,可以为不同的字符串加上一个加权值,这个加权值是介于 0 1 之间的数值,加权值越高的记录排在越前面

例五、搜索文章表中内容中含有 “download" 上海 山西 的记录,并为不同的条件加上加权值,其代码如下:

SELECT * FROM 文章 WHERE CONTAINS( 内容 , 'ISABOUT ("download" weight(0.9), " 上海 "  weight(0.6), " 山西 "  weight(0.5))')

SELECT * FROM 文章 WHERE CONTAINS( 内容 , 'ISABOUT (download weight(0.9), 上海  weight(0.6), 山西  weight(0.5))')

事实上在该 SELECT 语句的返回结果集里,并没有按加权值的大小来排序,因为 WEIGHT 不影响 CONTAINS 查询的结果,只会影响 CONTAINSTABLE 查询中的排序。 说明:使用本例时最好将 内容 字段的 断字符语言 改回简体中文,否则会影响中文的搜索结果  

 (7.1.5)邻近词的搜索方式

邻近词的搜索方式可以搜索记录中位置相近的两个字符,例如要搜索文章标题为 教育部拟取消教师资格终身制实行定期认证 的文章,完整的标题名记不清楚了,只记得 教育部 资格 ,则可以以邻近词的搜索方式进行查询

例六、搜索文章内容中与教育部表示相关的记录,其代码如下:

SELECT * FROM 文章 WHERE CONTAINS( 内容 ,' " 教育部 " NEAR " 表示 "')

(7.2)使用 FREETEXT 搜索

FREETEXT 搜索方式与 CONTAINS 搜索方式相比,其搜索结果表现都十分不精确,因为 FREETEXT 的搜索方式是将一个句子中的每个单字拆分开进行搜索的。例如:如果使用 CONTAINS 搜索方式搜索条件为 教育部 的记录,那么搜索出来的将是记录里包含 教育部 三个字符串的记录。如果使用 FREETEXT 搜索方式搜索条件为 教育部 的记录,那么搜索出来的将是记录里包含 的记录。如果搜索的是英文字符串 “SQL Server 2005” ,则拆分为 “SQL” “Server” “2005” 来进行搜索,只要满足其中一个条件都算搜索成功。 FREETEXT 的语法代码參考聯機幫助 CONTAINS FREETEXT 两种方式来搜索 教育部 字符串,其代码如下:

SELECT * FROM 文章 WHERE FREETEXT( 内容 ,' 教育部 ')

SELECT * FROM 文章 WHERE CONTAINS ( 内容 ,' 教育部 ')

其运行结果如图7.4 所示,使用 CONTAINS 查询结果要比使用 FREETEXT 的查询结果记录数要少得多。

7.4CONTAINS和FREETEXT的查询结果 7.4CONTAINS和FREETEXT的查询结果

(7.3)使用 CONTAINSTABLE 搜索

CONTAINSTABLE 函数与 CONTAINS 谓词类似,其可以返回符合条件的多条记录,但是返回的记录是作为数据表出现在 SELECT 语句的 FROM 子句中。这个数据表里只包含两个字段:一个字段名为 “KEY” ,该字段显示的是全文索引的唯一索引键的内容,也就是图 14.6 所示界面中所创建的索引列;另一个字段名为 “RANK” ,该字段是排名值字段,其排名值是由系统依查询符合的程度自动生成的。 CONTAINSTABLE 的语法代码參考聯機幫助

CONTAINSTABLE CONTAINS 的搜索条件一样分为五类,其形式也几乎一样,只是增加了 table top_n_by_rank 两个参数:

table :全文索引所在的数据表名。

top_n_by_rank :返回的记录数,相当于 SELECT 语句中的 top n

下面举几个例子说明 CONTAINSTABLE CONTAINS 在用法上不同的地方。

查看文章表中内容含有 教育部 的记录的编号,其代码如下:

SELECT * FROM    CONTAINSTABLE( 文章 , 内容 ,' 教育部 ') as table1

在本例中可以看到, CONTAINSTABLE 返回的结果是作为数据表的形式出现在 FROM 子句中。其运行结果如图 7.5 所示,查询的结果也就是 CONTAINSTABLE 返回的数据表的结果,只有两个字段。

7.5CONTAINSTABLE返回的结果 7.5CONTAINSTABLE返回的结果

查看文章表中内容含有 教育部 表示 的前十条记录,并按查询符合程度排序,其代码如下:

SELECT * FROM 文章 JOIN   CONTAINSTABLE( 文章 , 内容 ,' " 教育部 " NEAR " 表示 " ',10) as table

ON 文章 . 编号 = table1.[KEY]   ORDER BY table1.RANK DESC

其运行结果如图7.6 所示,在本例中,将 CONTAINSTABLE 函数返回的数据表与文章表 JOIN 起来进行联合查询,就好像一个真实的数据表一样。由于 KEY 是关键字,所以在本例当中用方括号将 KEY 括起来。

7.6例九的运行结果 7.6例九的运行结果

例十、搜索文章表中内容中含有 “download” 上海 山西 的记录,并为不同的条件加上加权值,然后按权值排序。其代码如下: SELECT * FROM 文章 JOIN CONTAINSTABLE( 文章 , 内容 , 'ISABOUT ("download" weight(0.9), " 上海 " weight(0.6), " 山西 "  weight(0.1))') AS TABLE1 ON 文章 . 编号 = TABLE1.[KEY] ORDER BY TABLE1.RANK DESC 其运行结果如图 7.7 所示, RANK 字段是依符合程度生成的数据再加上权值后的结果

7.7例十的运行结果 7.7例十的运行结果

 (7.4)使用 FREETEXTTABLE 搜索

CONTAINSTABLE 一样, FREETEXTTABLE 函数也是返回拥有 KEY RANK 两个字段的表,该表可以和数据库中的数据表一样使用。 FREETEXTTABLE 的语法 FREETEXT 谓词的语法代码相似,只是多了 table top_n_by_rank 两个参数。

例十一、查看文章表中 内容 字段含有 教育部 的前十条记录,其代码如下:

SELECT 文章 . 内容 ,TABLE1.* FROM 文章 JOIN   FREETEXTTABLE( 文章 , 内容 ,' 教育部 ',8) AS TABLE1

ON 文章 . 编号 = TABLE1.[KEY]

(7.5)搜索 image 字段

SQL Server 2005 image 类型的字段里,不仅仅是可以存储图形文件,还可以存储如可执行文件、音乐文件、文本文件等众多文件类型。 SQL Server 2005 支持对存储在 image 类型的字段里的一些文件的内容进行全文搜索,但在创建全文索引时必须指明存储在 image 字段里的文件的类型。如图5.3 所示

SQL Server 2005 支持对存储在 image 中的纯文本文件、网页文件、 Word 文件、 Excel 文件和 PowerPoint 文件的内容进行查询,其扩展名字段必须分别为 txt htm doc xls ppt 。全文索引创建完毕后,对 image 字段里的文件内容进行查询的方法与其他字段的查询方法是一样的:

例十二、查询存储在文章表的文件字段里的内容包含 数据库 的文件,其代码如下

SELECT 编号 , 标题 , 文件 , 扩展名 FROM 文章 WHERE CONTAINS( 文件 ,' 数据库 ')  

(8)2005新增:与全文索引相关的T-SQL语句

SQL Server 2005 以前的版本中,创建与管理全文目录、全文索引主要是使用存储过程来完成。从 SQL Server 2005 开始新增加了一些与全文索引相关的 T-SQL 语句,可以用来创建与管理全文目录和全文索引。

(8.1)创建全文目录

创建全文目录的 T-SQL 语句为

例十三、在 Northwind 数据库中创建一个名为 “TSQL 全文目录 全文目录,其代码如下:

CREATE FULLTEXT CATALOG TSQL 全文目录

ON FILEGROUP [PRIMARY]

IN PATH 'E:"book"SQL Server 2005 大全 " 数据库 " 第十四章 " 运行后数据库 '

AS DEFAULT

(8.2)更改全文目录属性

创建完全文目录之后,如果发现其设置有不如意之处,可以用 T-SQL 语句对其进行修改。更改全文目录属性的 T-SQL 语代码如下:

例十四、重新生成 “TSQL 全文目录 ,其代码如下:

ALTER FULLTEXT CATALOG TSQL 全文目录

REBUILD

(8.3)创建全文索引

有了全文目录后,可以在全文目录里创建全文索引。一个全文目录里可以包含多个全文索引,但一个全文索引只能属于一个全文目录。每个数据表只能有一个全文索引。创建全文索引的 T-SQL 语句代码如下:  

例十五、为 文章 表的 标题 内容 文件 三个字段创建全文索引,其代码如下:

CREATE FULLTEXT INDEX 

ON 文章 ( 标题 , 内容 , 文件 TYPE COLUMN 扩展名 )

KEY INDEX PK_ 文章

ON TSQL 全文目录

注意:由于在前面的章节里已经为 文章 表创建了全文索引,因此在运行本例之前要先把原来创建的全文索引删除。

(8.4)更改全文索引属性

创建完全文索引之后,如果发现其设置有不如意之处,可以用 T-SQL 语句对其进行修改。更改全文索引属性的 T-SQL 语句代码如下:

例十六、禁用 文章 表的全文索引,其代码如下:

ALTER FULLTEXT INDEX ON 文章

DISABLE

例十七、启用 文章 表的全文索引,其代码如下:

ALTER FULLTEXT INDEX ON 文章

ENABLE

例十八、将 文章 表里的 文件 字段从全文索引里删除,其代码如下:

ALTER FULLTEXT INDEX ON 文章

DROP ( 文件 )

例十九、填充 文章 表的全文索引,其代码如下:

ALTER FULLTEXT INDEX ON 文章

START FULL POPULATION

(8.5)  删除全文索引

删除全文索引的 T-SQL 的语法代码比较简单,如下所示:

DROP FULLTEXT INDEX ON table_name

例二十、删除 文章 表里的全文索引,其代码如下:

DROP FULLTEXT INDEX ON 文章

(8.6)  删除全文目录

删除全文目录的 T-SQL 的语法代码比较简单,如下所示:

DROP FULLTEXT CATALOG catalog_name

例二十一、删除 文章 表里的全文索引,其代码如下:

DROP FULLTEXT CATALOG TSQL 全文目录

注意:要删除全文目录必须为空,即不能包含有全文索引。

(9)小结

使用全文搜索可以快速、灵活地为存储在数据库中的文本数据的基于关键字的查询创建索引。与仅适用于字符模式的 LIKE 谓词不同,全文查询将根据特定语言的规则对词和短语进行操作,从而针对此数据执行语言搜索。

全文索引是由 SQL Server FullText Search 服务来维护的,必须选启动该服务才能使用全文索引。填充全文索引有三种方式:完全填充、增量填充和更改跟踪。

在全文索引中概念与术语比较多,如全文索引、全文目录、断字符、词干分析器、标记、筛选器、填充、干扰词等。了解怎么创建全文目录,怎么创建全文索引,怎么进行全文索引的填充,怎么使用调度让全文索引自动填充。

使用 CONTAINS FREETEXT 两个谓词和 CONTAINSTABLE FREETEXTTABLE 两个行集值函数可以用来进行全文搜索,其中 CONTAINS FREETEXT 用在 WHERE 子句中, CONTAINSTABLE FREETEXTTABLE 用在 FROM 子句中。 CONTAINS 搜索有简单词、派生词、前缀词、加权词和邻近词五种搜索方式。 FREETEXT 只有一种搜索方式,但是其将一个句子中的每个单字拆分开进行搜索。

SQL Server 2005 可以对存储在 image 类型字段里的文件进行全文搜索。其搜索的前提是必须要有一个字段指明 image 类型字段里存储的文件是什么类型。当为 image 类型字段设置好全文索引后,可以像其他字段一样地进行全文搜索。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值