已过去很长时间了,把这里的WORD传上来吧!!
全文索引
1、 CONTAINS
a) 区分大小写
b) Where CONTAINS(Description, ' "bean curd" ')
c) AND ,AND NOT,OR,NEAR,
d) CONTAINS( address, '"HEIBEI province"' )
remark: HEBEI province是一个词组,在单引号里还要用双引号括起来。
e) 第一个参数是要检索的列的名称,第二个参数是全文检索条件
CONTAINS 谓词支持使用复杂的语法在基于字符的列中检索:
- 一个或多个特定的单词和/或短语(简单条件)。
一个单词是一个或多个字符,中间没有空格或标点。有效的短语可以由带空格的多个单词组成,单词之间可以有标点也可以没有标点。例如,croissant 是一个单词,而 café au lait 是一个短语。这样的单词和短语称为简单条件。
- 特定单词的变形(派生条件)。
例如,检索单词 drive 的变形。如果表中的不同行包含单词 drive、drives、drove、driving 和 driven,那么所有这些都将包含在结果集中,因为其中每一个都可以从单词 drive 变形而来。
- 以指定文本(前缀条件)打头的单词或短语。
如果是短语,则该短语内的每个单词都被看作是一个前缀。例如,条件 auto tran* 与 automatic transmission 和 automobile transducer 匹配。
- 使用加权值的单词或短语(加权条件)。
例如,查找一个赋权值比另一个单词高的单词。这将返回排序的查询结果。
- 与另一个单词或短语相近的单词或短语(邻近条件)。
例如,查找一些行,这些行中单词 ice 与 hockey 相邻,或者短语 ice skating 与 ice hockey 相邻。
f) CONTAINS 谓词可以用 AND 和 OR 将这些条件中的几个结合起来,例如,要查找同一个启用全文的数据库列中所有有 latte 和 New York-style bagel 的行。不仅如此,还可以使用 AND NOT 对条件取反,例如 bagel and not cream cheese。
g) 在使用 CONTAINS 时,记住 SQL Server 将从检索条件中去掉干扰词。干扰词是象 a、and、is 或 the 这样的词,这些词可能经常出现,但是在检索特定文本时没有真正的帮助。
h)、CONTAINS 语法
我们通常在 WHERE 子句中使用 CONTAINS ,就象这样:SELECT * FROM table_name WHERE CONTAINS(fullText_column,'search contents')。
我们通过例子来学习,假设有表 students,其中的 address 是全文本检索的列。
1. 查询住址在北京的学生
SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, 'beijing' )
remark: beijing是一个单词,要用单引号括起来。
2. 查询住址在河北省的学生
SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, '"HEIBEI province"' )
remark: HEBEI province是一个词组,在单引号里还要用双引号括起来。
3. 查询住址在河北省或北京的学生
SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, '"HEIBEI province" OR beijing' )
remark: 可以指定逻辑操作符(包括 AND ,AND NOT,OR )。
4. 查询有 '南京路' 字样的地址
SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, 'nanjing NEAR road' )
remark: 上面的查询将返回包含 'nanjing road','nanjing east road','nanjing west road' 等字样的地址。
A NEAR B,就表示条件: A 靠近 B。
5. 查询以 '湖' 开头的地址
SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, '"hu*"' )
remark: 上面的查询将返回包含 'hubei','hunan' 等字样的地址。
记住是 *,不是 %。
6. 类似加权的查询
SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, 'ISABOUT (city weight (.8), county weight (.4))' )
remark: ISABOUT 是这种查询的关键字,weight 指定了一个介于 0~1之间的数,类似系数(我的理解)。表示不同条件有不同的侧重。
7. 单词的多态查询
SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, 'FORMSOF (INFLECTIONAL,street)' )
remark: 查询将返回包含 'street','streets'等字样的地址。
对于动词将返回它的不同的时态,如:dry,将返回 dry,dried,drying 等等。
i) SELECT FT_TBL.student_name,FT_TBL.student_score,KEY_TBL.RANK
FROM report AS FT_TBL INNER JOIN
CONTAINSTABLE( student,address,
'ISABOUT (city weight (.8), county wright (.4))' ) AS KEY_TBL
ON FT_TBL.student_id = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK
CONTAINSTABLE 返回的表包含有特殊的两列:KEY,RANK。
在第一部分里我们就强调了:被全文索引的表必须有唯一索引。这个唯一的索引列在返回的表中就成为 KEY。我们通常把它作为表连接的条件。
2、Microsoft® SQL Server™ 提供多文本数据检索系统。SQL Server 2000 提供了一种增强的全文检索服务,使您得以:
a) 在后台更新索引。
填充或更新索引不必影响其它任务。可以在后台使用全文索引向导、SQL Server 企业管理器或 SQL Server 代理程序作业调度程序来调度全文索引更新。
b) 在全文索引的三种维护方法中选择一种。
根据数据和资源情况,可在完全重建、基于时间戳的增量重建和更改跟踪这三种方法中选择一种来维护全文索引。完全重建方法涉及重新扫描所有行。基于时间戳的增量重建方法仅重新扫描自上次重建(完全重建或增量重建)索引后更改的行。通过使用更改跟踪方法,SQL Server 维护对索引数据的所有更改列表,可使用该列表更新全文索引
c) 对 image 列中存储的某些类型的数据进行索引和检索。
使用全文检索,可以对 image 列中存储的某些类型的数据进行索引和查询。全文检索使用几种支持的筛选之一来解释这些数据并析取文本数据,以便进行索引和查询。SQL Server 提供用于 .doc、.xls、.ppt、.txt 和 .htm 文件扩展名的筛选。有关更多信息,请参见筛选支持的文件类型。一旦对 image 列进行了索引,就可以使用检索谓词 CONTAINS 和 FREETEXT 检索该列。
d) 限制返回匹配的数量。
当在查询中使用 CONTAINSTABLE 或 FREETEXTTABLE 行集函数的可选参数 top_n_by_rank 时,SQL Server 将只返回排在前面的若干匹配项,数量由上面的数字 n 所指定。
3、返回包含字符串 "sea" 或 "bread" 的所有分类描述。
Use Northwind
Select * from categories
where contains( description, ' "sea*" or "bread*" ')
搜索产品描述中含有与 bread、candy、dry 和 meat 相关的词语的所有产品类别,如 breads、candies、dried 和 meats 等。
USE Northwind
GO
SELECT CategoryName
FROM Categories
WHERE FREETEXT (Description, 'sweetest candy bread and dry meat' )
GO
4、CONTAINSTABLE 和 FREETEXTTABLE 函数用来指定返回每行的相对排名的全文查询。这两个函数与全文谓词 CONTAINS 和 FREETEXT 很相似,但是用法不同。
5、全文索引完全图解
全文索引是解决海量数据模糊查询的较好解决办法。
全文检索可以对varchar,text,image型字段进行检索,但一个表最多只能建一个全文索引
SQL Server 2000 引入了对存储在 image 列中的这些类型的数据执行全文检索的能力。
如果没有全文索引,对字符的模糊查询只能对基表进行全表扫描(或索引扫描),
执行模糊查询都需要对全表扫描或索引扫描意味着消耗大量IO。
如果模糊查询经常发生,会造成数据库性能恶化。
本篇为简单起见,仅在varchar型字段上图文演示非常完整的而且是高效可行的全文索引
创建及维护过程.
1:
在企业管理器中展开要建立全文索引的数据库,右击“全文目录”,选择“新建全文目录”
如图1 所示。
可以修改全文目录的路径,通过将全文目录放在单独的磁盘或磁盘阵列可以提高效率。
建议不要对整个全文目录进行任何形式的填充调度。
=================== 图1 ===================
2:
接下来对具体的表添加全文索引。
全文索引不能建立在视图上,只能建立在有唯一索引(主键也是唯一索引)的基础表上。
下图2 演示如何对表建立全文索引。
演示中的 t_fulltext 表的建表及初始化数据的脚本如下:
create table t_fulltext
(
rid int identity(1,1),
title varchar(256) not null,
writetime datetime default(getdate())
)
go
alter table t_fulltext add constraint pk_fulltext primary key ( rid )
go
--初始化数据
insert into t_fulltext(title) values('山东蓬莱河西金矿透水事故2人死亡3人失踪(21:29)')
insert into t_fulltext(title) values('泰国将在广西南宁设立总领事馆(21:10)')
insert into t_fulltext(title) values('河北安徽等12省减免农业税等政策落实到位(20:43)')
insert into t_fulltext(title) values('台湾学者托梦预测陈水扁元旦讲话(20:04)')
insert into t_fulltext(title) values('澳门特首何厚铧发表元旦献辞向市民问候新年(20:02)')
insert into t_fulltext(title) values('南水北调首个建成项目山东段济平干渠通水成功(19:48)')
insert into t_fulltext(title) values('组图:北京110摩托车巡警亮相(18:07)')
insert into t_fulltext(title) values('福建广西发生患者死亡事件医院责任人被处理(17:33)')
insert into t_fulltext(title) values('北京大容量公交车运营首日遭遇乘客爆满(17:30)')
insert into t_fulltext(title) values('北京公安系统今天全部停休严查五环内放炮(17:30)')
insert into t_fulltext(title) values('研究发现海龙基因酶对禽流感病毒有杀伤作用(17:27)')
insert into t_fulltext(title) values('上海世博会筹办进入实质性操作面临五大挑战(17:03)')
insert into t_fulltext(title) values('台媒体称陈水扁元旦祝词必将老调重弹(15:30)')
insert into t_fulltext(title) values('珠三角咸潮影响范围小于去年(15:12)')
insert into t_fulltext(title) values('上海市民体验轨道交通4号线列车(组图)(14:53)')
insert into t_fulltext(title) values('广州亿元集资诈骗案主犯王日升被判死缓(图)(14:44)')
insert into t_fulltext(title) values(' 评论:取消农业税让民众共享经济增长成果(17:30)')
insert into t_fulltext(title) values('香港媒体谈美国应对中国新策略:合作与防范(15:57)')
insert into t_fulltext(title) values('专访中国地震局局长陈建民:地震是能够预测的(15:56)')
insert into t_fulltext(title) values('评论:野蛮公交莫成城市丑陋形象代言人(13:27)')
insert into t_fulltext(title) values('台媒体称当局与民间企业对立非民众之福(12:50)')
=================== 图2 ===================
3:出现的欢迎界面如图3
=================== 图3 ===================
4:为全文索引选择唯一索引,如图4
=================== 图4 ===================
5:选择全文索引的列,注意一张表只能建一个全文索引。建
议不要选择断词的语言,这样实际会使用默认的断词语言。如图5 所示。
通过运行
sp_configure 'default full-text language'
可以查看默认的断词语言,如我的机器上运行上条语句,config_value 值是 2052
它表示简体中文。
其它代码所表示的语言可以查阅Book Online的“default full-text language”关键词。
由于SQL Server对中文断词并不是很高明,因此并不能依靠SQL Server带给您非常智能的搜索,这意味着您的全文搜索结果,可能有不希望出现的记录,或您希望出现的记录没有出现。
=================== 图5 ===================
6:将表指派到全文目录,如图6 所示,也可以通过此界面创建新目录。
=================== 图6 ===================
7:接下来会提示对表进行填充调度,为能够准实时地把基表的全文索引列的修改(增、删、改)准实时地应用到全文索引,建议使用下面介绍的其它方法进行索引维护。如图7 所示,建议不要在这里添加任何调度,直接点击“下一步”。
如果数据不会再修改,则在一次完全填充以后,不用再增加其它类型的表级填充。
如果实施到本步骤,不再添加任何形式的表调度,那么基表数据的更新,将不能更新到全文索引。
=================== 图7 ===================
8:如图8 所示出现的完成界面提示中点击“完成 ”,请稍微等待直到出现下一界面。
=================== 图8 ===================
9:在如图9 所示的界面中点击“确定”。
由于尚未在表上添加任何调度,因此还需要继续设置。
=================== 图9 ===================
10:在企业管理器中右击 f_fulltext 表,如图10 所示,选中“更改跟踪”。
选中更改跟踪后,以后对基表数据的修改,才能反映到全文索引中。
特别注意:一旦选中“更改跟踪”,根据经验,其实是必须对该表进行完全填充的。
如果是在线使用的全文索引数据库,选中“更改跟踪”会导致性能迅速下降,导致全文索引
无法使用。
=================== 图10 ===================
11:在企业管理器中右击 f_fulltext 表,如图11 所示,选中“更新后台中的索引”。
到本步,全文索引就完全完成了。由于我们选中了“更改跟踪”,此时实际已经开始了表的完全填充。
根据经验,300万条全文索引字段长为 50 的表,需要8到10小时才能完成完全填充。
=================== 图11 ===================
12:可以通过双击全文目录下的全文索引,查看该全文目录的属性,如图12 所示,状态为“空闲”,而项目计数大于0,则表示完全填充已经完成了。
=================== 图12 ===================
13:如何进行全文索引查询(仅简单介绍)
全文索引查询建议使用 CONTAINS 及 FREETEXT 谓词进行查询。
如果关键词仅包括干扰词(有关干扰词的信息,请参阅Book Online的“干扰词”关键字)
select * from t_fulltext where contains(title,'3')
则会报如下错误
服务器: 消息 7619,级别 16,状态 1,行 1
全文操作运行失败。查询子句只包含被忽略的词。
使用下面的语法,能避免出现错误,且能够确实查询出正确的记录。
select * from t_fulltext where contains(title,'"*3*"')
13 台媒体称陈水扁元旦祝词必将老调重弹(15:30) 2005-12-31 23:17:17.670
10 北京公安系统今天全部停休严查五环内放炮(17:30) 2005-12-31 23:17:17.653
17 评论:取消农业税让民众共享经济增长成果(17:30) 2005-12-31 23:17:17.670
9 北京大容量公交车运营首日遭遇乘客爆满(17:30) 2005-12-31 23:17:17.653
8 福建广西发生患者死亡事件医院责任人被处理(17:33) 2005-12-31 23:17:17.653
(所影响的行数为 5 行)
6、1.搜索时出现错误:
服务器: 消息 7619,级别 16,状态 1,行 2
查询子句只包含被忽略的词
这种情况修改 "Mssql"Ftdata"Sqlserver"Config 下对应语言的干扰词列表文件
2.修改了干扰词文件,查询中文时仍然出现上述问题
a.首先检查你的SQL有没有安装最新的补丁,检查的方法是在查询分析器中运行:
select @@version
如果出来的版本号是8.00.760以下,则表明你未安装sp3的补丁,要装上.
注意下载后,执行的时候是解压,要在解压后的目录中执行setup.bat才是真正的安装
b.配置全文索引时,单词断字符选择"中文(中国)"
c.Noise.chs文件中至少有一个单词,例如
d.如果在全文检索时,你能正常修改干扰词文件,说明你的全文检索没有使用上这个文件
如果你配置的全文检索应该要用到这个文件,那就在
企业管理器--展开你的数据库--右键全文目录--重建全部全文目录
3.表中的数据改变后,检索不到
方法1. 右键你的表--全文索引表--启用增量填充
方法2. 右键你的表--全文索引表--更改跟踪,这样以后的修改会自动填充(有一定延迟)
4.sql2000才支持对image列的全文检索
7、一个完整的SQL SERVER数据库全文索引的示例。(以pubs数据库为例)
首先,介绍利用系统存储过程创建全文索引的具体步骤:
1) 启动数据库的全文处理功能 (sp_fulltext_database)
2) 建立全文目录 (sp_fulltext_catalog)
3) 在全文目录中注册需要全文索引的表 (sp_fulltext_table)
4) 指出表中需要全文索引的列名 (sp_fulltext_column)
5) 为表创建全文索引 (sp_fulltext_table)
6) 填充全文目录 (sp_fulltext_catalog)
---------********示例********-------------
以对pubs数据库的title和notes列建立全文索引,之后使用索引查询title列或notes列中包含有datebase 或computer字符串的图书名称:
在这之前,需要安装Microsoft Search服务,启动SQL server全文搜索服务
user pubs --打开数据库
go
--检查数据库pubs是否支持全文索引,如果不支持
--则使用sp_fulltext_database 打开该功能
if(select databaseproperty('pubs','isfulltextenabled'))=0
execute sp_fulltext_database 'enable'
--建立全文目录FT_PUBS
execute sp_fulltext_catalog 'FT_pubs','create'
--为title表建立全文索引数据元
execute sp_fulltext_table 'title','create','FT_pubs','UPKCL_titleidind'