`

[SQLSERVER]SQL中的全文检索

 
阅读更多

[SQLSERVER]SQL中的全文检索(转邹建) 

最近搜索了一下全文检索,发现了一些问题,现在总结如下:

全文索引和查询概念(摘自SQL 联机帮助)

全文索引、查询和同步化最主要的设计要求是,在注册进行全文检索的所有表上都有一个唯一的全文键列(或者单列主键)。全文索引对使用的重要字及其所在位置进行跟踪。

例 如,假定有一个对 DevTools 表的全文索引。全文索引可能指出在 Abstract 列的第 423 个和第 982 个单词处找到了单 词 Microsoft,所在的行与 ProductID 6 关联。该索引结构支持对所有包含被索引单词的项进行有效检索,以及高级检索操作,如短语检 索和邻近检索。

为防止全文索引因包含很多对检索没有帮助的词而变得臃肿,a、and、is 或 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 排序规则区域设置标识符设置用于所有可进行全文索引的数据类型(如 char、nchar 等)。如果为 char、 varchar 或 text 类型列的排序次序设置的语言类型,不是 Unicode 排序规则区域设置标识符语言,那么在对 char、 varchar 和 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盘下放一个扩展名为doc的word文件,一个扩展名为xls的excel文件,一个扩展名为htm的网页文件,个扩展名为bmp的图片
   共4个,大家可根据实际情况放入!

5、插入数据
  建立下面这个存储过程
--------------------------------------------------
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 
/* 这是使用textcopy工具将文件插入到数据库中,如果有前台工具可以用前台开发工具将文件插入,这里为了演示 */
DECLARE @exec_str varchar (255) 
SELECT @exec_str='textcopy /S '+@srvname+' /U '+@login+' /P '+@password+' /D '+@dbname+' /T'+@tbname+' /C '+@colname+' /W"'+@whereclause+'" /F"'+@filename+'" /'+@direction
EXEC master..xp_cmdshell @exec_str
----------------------------------------------------

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

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高级服务器


 

全文索引中的几个问题:

1.搜索时出现错误:
  服务器: 消息 7619,级别 16,状态 1,行 2
  查询子句只包含被忽略的词

  这种情况修改 \Mssql\Ftdata\Sqlserver\Config 下对应语言的干扰词列表文件

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

    SQL补丁下载:
    ::URL::http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=9032f608-160a-4537-a2b6-4cb265b80766

    注意下载后,执行的时候是解压,要在解压后的目录中执行setup.bat才是真正的安装

  b.配置全文索引时,单词断字符选择"中文(中国)"

  c.Noise.chs文件中至少有一个单词,例如:?

  d.如果在全文检索时,你能正常修改干扰词文件,说明你的全文检索没有使用上这个文件
    如果你配置的全文检索应该要用到这个文件,那就在
    企业管理器--展开你的数据库--右键全文目录--重建全部全文目录

3.表中的数据改变后,检索不到
  方法1. 右键你的表--全文索引表--启用增量填充
  方法2. 右键你的表--全文索引表--更改跟踪,这样以后的修改会自动填充(有一定延迟)

4.sql2000才支持对image列的全文检索

分享到:
评论

相关推荐

    SQL Server 全文检索

    如何在大量文字中加快搜索关键词的速度?– SQL Server的全文检索

    手把手教你SQLserver2008全文检索使用方法

    下面我们将详细介绍如何在SQL Server 2008中启用并使用全文检索。 #### 二、启用全文检索服务 1. **启动SQL Full-text服务** - 首先确保SQL Server Full-text服务已启动。如果服务未启动,可以通过控制面板的服务...

    SQL_Server_2005全文检索技术

    在SQL Server 2005中,全文检索技术的核心特点包括: 1. **断字符(Word Breaker)**:断字符是根据特定语言规则确定的用于分割单词的符号。例如,英文中通常以空格作为断字符,而中文则需要考虑汉字的连写和词组。...

    SQLServer2000中的全文检索

    本文介绍了SQLServer2000中全文检索使用

    SqlServer连接工具

    综上所述,SQL Server连接工具是SQL Server生态系统中不可或缺的一部分,它们为数据库管理员和开发者提供了强大的支持,使得SQL Server的管理和开发工作更加高效便捷。无论是在本地环境还是云端,选择合适的工具能够...

    SQL Server2000中的全文检索.pdf

    在SQL Server 2000数据库中,全文检索是通过集成Windows操作系统的搜索服务来实现的。全文检索的核心功能包括全文索引器的创建和使用,以及一系列相关的Transact-SQL操作。 全文索引器是用于创建和填充全文目录的...

    SQL Server 2005 中做全文检索的方法分享

    在SQL Server 2005中,全文检索是一种强大的功能,它允许用户通过自然语言查询来搜索数据库中的文本数据,而不仅仅是基于精确匹配的关键词。全文检索提供了更高级的搜索能力,例如模糊匹配、近义词搜索和短语搜索。...

    微软sql server 2005全文检索的BUG解决方案

    在SQL Server 2005中,全文检索是数据库系统中的一个重要特性,它允许用户执行复杂的文本搜索,提高数据检索的效率。然而,正如标题所提及的,SQL Server 2005的全文检索功能存在一些已知的问题,尤其是与SQL Server...

    Microsoft SQL Server 2005 向后兼容组件SQLServer2005_BC.msi

    SQLServer2005_BC.msi 文件是这个向后兼容组件的安装程序,它包含了用于在更新的SQL Server环境中模拟SQL Server 2005环境的特定库和接口。安装此组件后,用户可以继续使用那些设计时依赖SQL Server 2005特性的应用...

    sqlserver数据库精简版

    5. **索引**:SQL Server使用索引来加速数据检索,包括B树索引、聚集索引和非聚集索引等。 6. **复制技术**:SQL Server支持数据复制,可以将数据从一个服务器复制到多个服务器,用于分布式系统或灾难恢复。 7. **...

    sql server 2008 native client

    1. 支持FILESTREAM:允许将二进制大数据存储为文件系统中的文件,同时保持在SQL Server中的事务一致性。 2. 支持行列式数据库(MPP)架构:通过并行查询处理,提高了大规模数据仓库的性能。 3. 改进了对XML数据类型...

    sql server 2005如何进行全文检索

    SQL Server 2005中的全文检索是一种强大的搜索机制,它允许用户使用自然语言查询来查找包含特定词汇或短语的记录,而不仅仅是基于精确匹配的简单查询。全文检索通过索引表中的文本数据,提高了搜索效率和精度,使得...

    用SQL Server 2000进行全文检索.pdf

    4. 根据文档片段,全文检索功能可以和SQL Server的其他技术(例如ASP, ADO)配合使用,这表明了SQL Server 2000全文检索功能在实际应用中能够与其他技术实现较好的集成,实现例如Web应用中的数据检索。 5. 需要注意...

    SQL Server 全文索引查询

    SQL Server全文索引查询是一种在SQL Server数据库中用于高效检索大量文本数据的技术。与传统的基于B树结构的索引不同,全文索引专注于处理“包含”式查询,即查询字符串中是否包含特定的关键词,而不仅仅是以特定...

    MFC连接SQL Server数据库

    `m_pConnection->Open("driver={SQLServer};Server=192.168.1.100,1433;database=juyuwang;UID=sa;PWD=123456","","",adModeUnknown);` 其中,“192.168.1.100”是远程服务器的IP地址,“1433”是端口号。 结论 ...

    MS SQL Server对文件内容进行全文检索的查询

    针对文件内容的全文检索,本文介绍了一种利用Windows索引服务和MS SQL Server结合的解决方案,使得用户能够在上传的文件中进行高效、准确的全文搜索。 首先,文件存储策略是关键。为了确保文件的独特性和便于索引,...

    基于SQL SERVER 2005的图像检索

    在图像检索项目中,SQL Server 2005被用作图像数据的仓库,可以存储大量的图像文件,并通过高效的查询机制快速检索出所需图像。在设置数据库时,需要创建合适的表结构来存储图像数据,可能包括图像的元信息(如创建...

    SQLServer2005客户端SQLServer2005_SSMSEE.msi

    "SQLServer2005_SSMSEE.msi" 文件就是SQL Server 2005的System Management Studio Express(SSMSEE)的安装程序,这是一个简化版的SQL Server Management Studio,专为开发者和小型团队设计,提供基础的数据库管理和...

    SQL Server Native Client大全(官网下载整理9,10,11)

    - **ADO.NET**:虽然不包含在SQL Server Native Client中,但ADO.NET是.NET Framework的一部分,主要用于.NET应用程序与SQL Server的交互。 - **SQL Server JDBC驱动**:适用于Java平台,与SQL Server Native ...

    如何使用SQL全文检索

    在SQL Server 2000中,全文检索是一项重要的功能,它极大地改进了数据查询的效率和用户体验。 首先,我们要理解普通SQL索引与全文索引的区别。普通索引,如B树索引,主要用于快速定位数据行,基于精确的值进行比较...

Global site tag (gtag.js) - Google Analytics