ITPub博客

首页 > 数据库 > 数据库开发技术 > 全文索引和查询概念

全文索引和查询概念

原创 数据库开发技术 作者:kitesky 时间:2006-09-06 00:52:15 0 删除 编辑
(摘自http://faq.xunweb.org/itfaq/mssql2/2006-06-05/12902.html)
faq-it.org/mysql/
[@more@]

一 全文索引及查询概述
全文索引、查询和同步化最主要的设计要求是,在注册进行全文检索的所有表上都有一个唯一的全文键列(或者单列主键)。全文索引对使用的重要字及其所在位置进行跟踪。
例如,假定有一个对 DevTools 表的全文索引。全文索引可能指出在 Abstract 列的第 423 个和第 982 个单词处找到了单词 Microsoft,所在的行与 ProductID 6 关联。该索引结构支持对所有包含被索引单词的项进行有效检索,以及高级检索操作,如短语检索和邻近检索。 为防止全文索引因包含很多对检索没有帮助的词而变得臃肿,aandis the 这类额外的词都忽略不计。例如,指定"the products ordered during these summer months"与指定"products ordered during summer months"是一样的。有这两个字符串的行都会被返回。 目录 /Mssql/Ftdata/Sqlserver/Config 下提供了多种语言的干扰词列表。在安装带有全文检索支持的 Microsoft® SQL Server™ 时会创建这个目录,并同时安装干扰词文件。干扰词文件可以编辑。例如,高技术公司的系统管理员可以把单词 computer 添加到他们的干扰词表中去。(如果编辑干扰词文件,则必须在更改生效之前重新填充全文目录。)下表显示了干扰词文件及其相应的语言。 干扰词文件 语言
-------------- ---------
Noise.chs
简体中文
Noise.cht
繁体中文
Noise.dat
语言中性
Noise.deu
德语
Noise.eng
英语(英国)
Noise.enu
英语(美国)
Noise.esn
西班牙语
Noise.fra
法语
Noise.ita
意大利语
Noise.jpn
日语
Noise.kor
韩文
Noise.nld
荷兰语
Noise.sve
瑞典语 在处理全文查询时,检索引擎将满足检条件的行的键值返回给 Microsoft SQL Server。比如有一个 SciFi 表,其中 Book_No 列是主键列。

Book_No Writer Title
-------- ----------- --------------------------
A025 Asimov Foundation's Edge
A027 Asimov Foundation and Empire
C011 Clarke Childhood's End
V109 Verne Mysterious Island
假定想使用一个全文检索查询来查找包含单词 Foundation 的书名。在本例中,将从全文索引获得值 A025 A027。然后 SQL Server 用这些键值和其它栏的信息响应该查询。 下表显示了存储全文索引数据所使用的语言。这些语言基于 SQL Server 安装期间选择的 Unicode 排序规则区域设置标识符。

Unicode 排序规则区域设置标识符

全文数据存储所用的语言

中文注音符号(台湾)

繁体中文

汉语拼音

简体中文

中文笔画

简体中文

中文笔画(台湾)

繁体中文

荷兰语

荷兰语

英语(英国)

英语(英国)

法语

法语

通用 Unicode

英语(美国)

德语

德语

德文电话簿

德语

意大利语

意大利语

日语

日语

日语 Unicode

日语

韩文

韩文

韩文 Unicode

韩文

西班牙语(现代)

西班牙语

瑞典/芬兰语

瑞典语

此列表中没有的其它所有 Unicode 排序规则区域设置标识符值都映射到使用空格分隔单词的中性语言单词的断字符和词干分隔符。 说明 Unicode 排序规则区域设置标识符设置用于所有可进行全文索引的数据类型(如 charnchar 等)。如果为 charvarchar text 类型列的排序次序设置的语言类型,不是 Unicode 排序规则区域设置标识符语言,那么在对 charvarchar text 类型的列进行全文索引和查询时,仍然使用 Unicode 排序规则区域设置标识符值。


---------------------------------------------------------------
创建全文索引(以索引image列为例,其他类型字段大致一样) 标题 全文索引image列,全攻略! 作者 pengdali [原作] 关键字 全文索引 image 今天百年不遇的停电了,看了一天书。晚上搞了一下全文索引,决定把心得贴出来,我尽量写的详细,大家共同学习,欢迎指正!

1
、启动 Microsoft Search 服务 开始菜单-->SQL程序组-->服务管理器-->下拉筐-->Microsoft Search 服务-->启动它

2

../Microsoft SQL Server/MSSQL/FTDATA/SQLServer/Config/
目录里建一个非空noise.chs文件 非空noise.chs文件,也有人说是空的noise.chs文件,但我每次都往里写几个没用的字母。

3
、建立环境 打开查询分析器-->执行下列脚本:
--------------------------------------------
create database test ---
创建test数据库
use test ---
选择test数据库
create table dali (ID int not null primary key,MyImage image,FileType varchar(255),FileNmae varchar(255)) ---
创建dali
--dali
表中 Id,MyImage,FileType 三列是必须的,因为要对image列索引的话,必须要有一个主键列,一个image,一个存放文件类型的列
--
我们知道在windows系统中文件类型是靠扩展名来区分的所以FileType列也就是用来放 文件的扩展名
--------------------------------------------

sp_fulltext_database 'enable' --
为全文索引启用数据库
sp_fulltext_catalog 'My_FullDir', 'create' ---
创建一个叫My_FullDif的全文目录

declare @Key sysname ; select @Key=c.name from syscolumns a,sysconstraints b,sysobjects c where a.id=object_id('dali') and a.name='ID' and a.id=b.id and b.constid=c.id and c.name like 'PK%'
exec sp_fulltext_table 'dali','create','My_FullDir',@Key ----
这两句是为全文索引,对表进行标记

sp_fulltext_column 'dali','MyImage','add',0x0804,'FileType' ---
这句是指定MyImage列为全文索引列,FileType是类型列
------------------------------------------------
4
、在c盘下放一个扩展名为docword文件,一个扩展名为xlsexcel文件,一个扩展名为htm的网页文件,个扩展名为bmp的图片 4个,大家可根据实际情况放入!

5
、插入数据 建立下面这个存储过程
/*
这是使用textcopy工具将文件插入到数据库中,如果有前台工具可以用前台开发工具将文件插入,这里为了演示 */
/*
C:Program FilesMicrosoft SQL ServerMSSQLBinn textcopy.exe 拷贝到C: */
--------------------------------------------------
CREATE PROCEDURE sp_textcopy

@srvname varchar (30),

@login varchar (30),

@password varchar (30),

@dbname varchar (30),

@tbname varchar (30),

@colname varchar (30),

@filename varchar (30),

@whereclause varchar (40),

@direction char(1)

AS

BEGIN

DECLARE @exec_str varchar (255)

SELECT @exec_str='C:textcopy /S '+@srvname+' /U '+@login+' /P '+@password+' /D '+@dbname+' /T'+@tbname+' /C '+@colname+' /W"'+@whereclause+'" /F"'+@filename+'" /'+@direction

EXEC master..xp_cmdshell @exec_str

END

GO

----------------------------------------------------

insert dali values(1,0x,'doc','
大力的doc') ---其中第二列是 0x 它是一个16进制数对应image,是必须的,不要写null(如果是text类型则为空字符串''),第三列是文件类型,既扩展名

sp_textcopy '
你的服务器名','sa','你的密码','test','dali','MyImage','c:/大力的doc.doc','where ID=1','I'
-------
依次参数是:实例名,用户名,密码,数据库名,表名,image列名,路径及文件名,条件(你必须保证它只选择一行)I
---------------------------------------------------------------------------------------------------------------
insert dali values(2,0x,'bmp','
图片')
sp_textcopy '
你的服务器名','sa','你的密码','test','dali','MyImage','c:/图片.bmp','where ID=2','I' --注意条件是 ID=2

insert dali values(3,0x,'xls','Excel
文件')
sp_textcopy '
你的服务器名','sa','你的密码','test','dali','MyImage','c:/Excel文件.xls','where ID=3','I' --注意条件是 ID=3

insert dali values(4,0x,'htm','
网页')
sp_textcopy '
你的服务器名','sa','你的密码','test','dali','MyImage','c:/网页.htm','where ID=4','I' --注意条件是 ID=4

---------------------------------------------------------------------------------------------------------------
上面的语句,要保证类型一样,路径正确,条件唯一正确应该就可以了

6
、填充全文索引

sp_fulltext_table 'dali','start_full' ---
第一个参数是表名,第二个参数是启动表的全文索引的完全填充

7
、可以开始你的实验了

select * from dali where contains(MyImage,'J
老师')

select * from dali where contains(MyImage,'
海老师')

------END----------
--
调试环境:SQLServer2000企业版、Windows2000高级服务器
8、索引更新问题
要使全文目录中的内容与数据库索引表的内容相一致,可通过Full Population或Incremental Population来实现:企业管理器中展开数据库CoreDB,双击Full-Text Catalog,会看到有一个名为content的全文目录,选中右击,点Start Full Population或Start Incremental Population,此时即可使用索引功能。
以后数据库中的索引表有更新时,都需要进行Population同步操作,全文查询的内容才是新的数据表中的内容。因此我们可以设定sql server自动进行Population操作:右击名为content的full text catalog,Schedules,New Catalog Schedules,输入名字,选中Enabled选项,可以设置计划任务的执行频率,可设置每次启动SQL server agent的时候启动,也可以设置执行一次,或者设置重复执行,重复执行里面可以设置执行频率为月,周,日,可以设置每天若干小时执行一次。(这样只要Service里面启动了sql server agent,population同步计划都会自动执行)

---------------------------------------------------------------------------
全文索引中的几个问题:

1.
搜索时出现错误: 服务器: 消息 7619,级别 16,状态 1,行 2 查询子句只包含被忽略的词 这种情况修改 /Mssql/Ftdata/Sqlserver/Config 下对应语言的干扰词列表文件

2.
修改了干扰词文件,查询中文时仍然出现上述问题
a.
首先检查你的SQL有没有安装最新的补丁,检查的方法是在查询分析器中运行:
select @@version
如果出来的版本号是8.00.760以下,则表明你未安装sp3的补丁,要装上.

SQL
补丁下载:
http://www.microsoft.com/downloads/d
使用 Microsoft SQL Server 2000 的全文搜索功能构建 Web 搜索应用程序:
http://www.microsoft.com/china/msdn/archives/library/dnsql2k/html/sql_fulltextsearch.asp

二 全文索引的使用
1. 建立全文索引

在进行全文检索之前,必须先建立和填充数据库全文索引。为了支持全文索引操作,SQL Server 7.0新增了一些存储过程和Transact-SQL语句。使用这些存储过程创建全文索引的具体步骤如下(括号内为调用的存储过程名称):

1. 启动数据库的全文处理功能(sp_fulltext_

database);;

2. 建立全文检索目录(sp_fulltext_catalog);

3.在全文检索目录中注册需要全文索引的表(sp_fulltext_table);

4. 指出表中需要全文检索的列名(sp_fulltext_

column);;

5. 为表创建全文索引(sp_fulltext_table);;

6. 填充全文检索目录(sp_fulltext_catalog)。

下面举例说明如何创建全文索引,在本例中,对Test数据库Book表中Title列和Notes列建立全文索引。

use test //打开数据库

//打开全文索引支持,启动SQL Server的全文搜索服务

execute sp_fulltext_database ‘enable’

//建立全文检索目录ft_test

execute sp_fulltext_catalog ‘ft_test’, ‘create’

为Title列建立全文索引数据元,pk_title为Book表中由主键所建立的唯一索引,这个参数是必需的。

execute sp_fulltext_table ‘book’,‘create’, ‘ft_test’,‘pk_title’

//设置全文索引列名

execute sp_fulltext_column ‘book’, ‘title’, ‘add’

execute sp_fulltext_column ‘book’,‘notes’, ‘add’

//建立全文索引

execute sp_fulltext_table ‘book’, ‘activate’

//填充全文索引目录

execute sp_fulltext_catalog ‘ft_test’, ‘start_full’

至此,全文索引建立完毕。

2. 进行全文检索

SQL Server 2000提供的全文检索语句主要有CONTAINS和FREETEXT。CONTAINS语句的功能是在表的所有列或指定列中搜索:一个字或短语;一个字或短语的前缀;与一个字相近的另一个字;一个字的派生字;一个重复出现的字。

CONTAINS语句的语法格式为:

CONTAINS({column | *}),
_condition>)

其中,column是搜索列,使用“*”时说明对表中所有全文索引列进行搜索。Contains_search_

condition 说明CONTAINS语句的搜索内容,其语法格式为:

{||||}[{{AND|AND NOT|OR}}] [...n]

下面就simple_term和prefix_term参数做简要说明:

simple_term是CONTAINS语句所搜索的单字或短语,当搜索的是一个短语时,必须使用双引号作为定界符。其格式为:

{‘word’|“ phrase”}

prefix_term说明CONTAINS语句所搜索的字或短语前缀,其格式为:

{“word*” | “phrase*”}

例如,下面语句检索Book表的Title列和Notes列中包含“database”或“computer”字符串的图书名称及其注释信息:

select title, notes

from book

where contains(tilte, ‘database’) or contains(notes,‘database’)

or contains(title,‘computer’) or contains(notes,‘computer’)

FREETEXT语句的功能是在一个表的所有列或指定列中搜索一个自由文本格式的字符串,并返回与该字符串匹配的数据行。所以,FREETEXT语句所执行的功能又称做自由式全文查询。

FREETEXT语句的语法格式为:FREETEXT({column | * },‘freetext_string’)

其中,column是被搜索列,使用“*”时说明对表中的所有全文索引列进行搜索。Freetext_string参数指出所搜索的自由文本格式字符串。

例如,下面语句使用FREETEXT语句搜索Book表中包含“Successful Life”字符串的数据行:

select title, notes

from book

where freetext(*,‘Successful Life’)

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/66009/viewspace-863527/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-04-22

  • 博文量
    273
  • 访问量
    2173105