SQL中的全文检索

转载 2006年06月23日 11:04:00

 全文索引和查询概念(摘自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补丁下载:  
          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 全文检索

  • 2009年11月13日 11:53
  • 12.5MB
  • 下载

SQL Server 2000中全文检索的使用

微软的SQL Server数据库是一个在中低端企业应用中占有广泛市场的关系型数据库系统,它以简单、方便、易用等特性深得众多软件开发人员和数据库管理人员的钟爱。但SQL Server 7.0以前的数据库...

SQL_Server_2005全文检索技术

  • 2011年05月08日 21:03
  • 415KB
  • 下载

SQL server 全文檢索搜尋

  • 2011年07月18日 23:53
  • 2.44MB
  • 下载

SQL Server 2000全文检索

由导学宝转自: http://topic.csdn.net/u/20081109/21/d2fde051-8e9b-4806-be18-5cdbcbf7ddad.html 一、如何在SQL...

关于sql全文检索与lucene效率比较的摘要

关于sql全文检索与lucene效率比较的摘要,以下仅为网络找到的效率意见,近期会对效率做出测试比较,再更新。   ------------------------------------------...
  • skydxd
  • skydxd
  • 2012年07月02日 13:38
  • 3174

微软sql server 2005全文检索的BUG

微软sql server 2005的全文检索功能有问题,对于一些特殊的汉字,会产生填充不完全或者错误填充的情况,但微软不说这是一个BUG,只说这是微软底层开发的分词填充技术上的一些不足所引起的.  ...

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

MS SQL Server 对文件内容进行全文检索的查询     因为项目需要,需要对上传的文件内容进行查询。通过MSDN了解到Windows索引服务可以实现对文件的全文检索,并可以通过SQL ...

【SQL Server学习笔记】全文检索

全文检索提供了基于字符串、二进制数据的智能单词短语的搜索,使得非结构化数据的搜索更为灵活,而且全文检索的执行效率比普通的like查询好很多。在SQL Server2008中全文检索功能已经集成到了数据...
  • yupeigu
  • yupeigu
  • 2012年07月27日 11:58
  • 2216
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL中的全文检索
举报原因:
原因补充:

(最多只允许输入30个字)