启用和禁用全文索引
全文索引创建完毕之后,不会立即自动启用,所以需要手动启用全文索引。启动全文索引的方法如下:
(1)在【对象资源管理器】窗口里展开树形目录,定位到要启用全文索引的数据表。
(2)右击要启用全文索引的数据表,在弹出的快捷菜单中选择【全文索引】à【启用全文索引】。
如果要禁用全文索引,也可以采取以下的方法来禁用全文索引:
(1)在【对象资源管理器】窗口里展开树形目录,定位到要启用全文索引的数据表。
(2)右击要禁用全文索引的数据表,在弹出的快捷菜单中选择【全文索引】à【禁用全文索引】。
删除全文索引
当全文索引不再使用时,可以将其删除,删除方法如下:
(1)右击要删除全文索引的数据表,在弹出的快捷菜单里选择【全文索引】à【删除全文索引】。
(2)在弹出的【删除全文索引】对话框里单击【确定】按钮完成操作。
使用全文搜索查询
设置完全文索引并填充完毕之后,就可以通过全文搜索来查询数据了。使用全文搜索来查询数据所用到的T-SQL语句也是SELECT语句,只是在设置查询条件时和前面所说过的SELECT语句的查询条件设置有些不同。在T-SQL语言中,可以在SELECT语句的WHERE子句里设置全文搜索的查询条件,也可以在FROM子句里设置查询条件,此时将返回结果作为FROM子句中的表格来使用。
如果要在WHERE子句里设置全文搜索的查询条件,可以使用CONTAINS和FREETEXT两个谓词;如果要在FROM子句里设置全文搜索的查询条件 ,可以使用CONTAINSTABLE和FREETEXTTABLE两个行集值函数。
使用CONTAINS搜索
CONTAINS用于SELECT语句的WHERE子句中,可以支持使用复杂的语法在字符列中搜索词、子句、衍生字或位置相近的字符串。使用CONTAINS谓词可以在数据表中使用以下五种形式搜索数据:
l 简单词:也就是可以搜索一个或多个特定的词或短语。词可以包括一个或多个字符,中间没有空格或标点。短语可以是由空格分隔的多个词组成,但词之间可以有标点也可以没标点。
l 派生词:也就是可以搜索特定词的变形,一般是指英语中的单词,其有过去式、现在式、将来式等不同的形式。派生词是指可以包含该单词的所有其他形式。
l 前缀词:也就是可以搜索指定文本开头的词或短语。一般也用于英文单词中,可以指定一个英文单词的前几个字母来作为搜索条件。
l 加权词:也就是可以给多个搜索条件加上权值,加权值越高的记录排在越前面。
l 邻近词:也就是可以搜索与另一个词或短语相邻近的词或短语。
下面分别介绍如何使用这些不同的方式来搜索数据。
CONTAINS的语法
CONTAINS的语法代码如下:
CONTAINS
( { column_name | (column_list) | * } --列名
, '< contains_search_condition >' --搜索语句
[ , LANGUAGE language_term ] --发出查询时所用的语言
)
< contains_search_condition > ::=
{ < simple_term > --简单词搜索方式
| < prefix_term > --前缀词搜索方式
| < generation_term > --派生词搜索方式
| < proximity_term > --邻近词搜索方式
| < weighted_term > --权重词搜索方式
}
| { ( < contains_search_condition > ) --搜索语句
[ { AND | & | AND NOT | & ! | OR | | } ] --条件
< contains_search_condition > [ ...n ] --搜索语句
}
< simple_term > ::= --简单词搜索方式语法块
word | " phrase "
< prefix term > ::= --前缀词搜索方式语法块
{ "word * " | "phrase *" }
< generation_term > ::= --派生词搜索方式语法块
FORMSOF (
{ INFLECTIONAL --指定词干分析器
| THESAURUS } , --指定同义词库
< simple_term > [ ,...n ] )
< proximity_term > ::= --邻近词搜索方式语法块
{ < simple_term > | < prefix_term > }
{ { NEAR | ~ }
{ < simple_term > | < prefix_term > }
} [ ...n ]
< weighted_term > ::= --权重词搜索方式语法块
ISABOUT
( { {
< simple_term >
| < prefix_term >
| < generation_term >
| < proximity_term >
}
[ WEIGHT ( weight_value ) ] --指定权重
} [ ,...n ]
)
其中常用的参数为:
l column_name:字段名
l column_list:字段名列表
l *:所有字段
l LANGUAGE language_term:用于设置查询时所用的语言。例如在image字段里可能会存储了多种语言的文档,该参数允许用户指定搜索使用的语言,从而提高匹配率。
l INFLECTIONAL:用于指定使用与语言相关的词干分析器。词干分析器用于根据每种具体语言的判断词干。
l THESAURUS:用于指定同义词库。
简单词的搜索方式
简单词的搜索方式就是搜索一个或多个特定的词或短语。
例一、搜索文章表的标题中含有“上海”的记录,其代码如下:
SELECT * FROM 文章
WHERE CONTAINS(标题,'上海')
例二、搜索文章表的内容中含有“上海”或“广州”的记录,其代码如下:
SELECT * FROM 文章
WHERE CONTAINS(内容,' "上海" OR "广州"')
注意例二与例一的不同,在CONTAINS谓词的第二个参数里,将“”上海” OR “广州””做为一个字符串传递给CONTAINS。使用以下代码将会出错:
SELECT * FROM 文章
WHERE CONTAINS(内容,' 上海‘ OR ’广州')
派生词的搜索方式
派生词的搜索方式主要用在英文当中,因为英文单词中含有现在式、过去式、将来式、单复数等不同的形式,使派生词的搜索方式可以将字段中包括该单词的所有形式的记录都搜索出来。例如使用派生词方式搜索包含单词download的记录,则会把包含download、downloading等派生词的记录都搜索出来。
例三、搜索文章表中内容中含有download及其派生词的记录,其代码如下:
SELECT * FROM 文章
WHERE CONTAINS(内容,'FORMSOF(INFLECTIONAL,download)')
注意CONTAINS谓词的不同处,运行结果如图19所示。
图19 运行结果
在图19中可以看到只查询到一条记录,而并未将download的派生词也搜索进来,这是因为从一开始设置全文索引时,所采用的是数据库默认的断字符语言,即简体中文,而在中文中没有派生词,所以使用派生词方式搜索数据是起不到其作用的。此时可以通过修改全文索引的断字符语言来达到搜索效果。修改方式如下:
(1)右击全文索引所在的数据表,在弹出的快捷菜单中选择【全文索引】à【属性】弹出如图12所示【全文索引属性】对话框。
(2)在【全文索引属性】对话框里选择【列】选项,弹出如图20所示对话框,修改【内容】字段的【断字符语言】为“English”。
图20 修改断字符语言
(3)单击【确定】按钮完成操作。
再次运行例三中的代码,其运行结果如图14.21所示。
图21 正确的运行结果
前缀词的搜索方式
前缀词的搜索方式主要也是用在搜索英文中,例如搜索以“do”开头的单词,则可以将doctor、document、download等单词都搜索出来。
例四、搜索文章表中内容中含有“do”开头的单词的记录,其代码如下:
SELECT * FROM 文章
WHERE CONTAINS(内容,' "do*" ')
此方式有点类似与like子句的通配符方式,但只能使用“*”,并且只能放在英文字母之后,如“*do”、“*do*”都是错误的表达方式。
加权词的搜索方式
当以多个字符串作为搜索条件搜索记录时,可以为不同的字符串加上一个加权值,这个加权值是介于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查询中的排序。
说明:使用本例时最好将“内容”字段的“断字符语言”改回简体中文,否则会影响中文的搜索结果。
邻近词的搜索方式
邻近词的搜索方式可以搜索记录中位置相近的两个字符,例如要搜索文章标题为“教育部拟取消教师资格终身制实行定期认证”的文章,完整的标题名记不清楚了,只记得“教育部”和“资格”,则可以以邻近词的搜索方式进行查询。
例六、搜索文章内容中与教育部表示相关的记录,其代码如下:
SELECT * FROM 文章
WHERE CONTAINS(内容,' "教育部" NEAR "表示"')