代码改变世界

SQLServer2000全文检索技术

  JohnHoo  阅读(806)  评论(0编辑  收藏  举报
SQLServer2000全文检索技术
 

  SQLServer2000提供的全文检索功的基础是全文索引。也就是说,在实现全文检索之前,首先要建立全文索引。
  什么是全文索引?一个全文索引存储了表中若干个列的具体内容。全文检索就是利用全文索引中的信息查找有特定字符串的数据行。
  在开始操作数据库之前先了解几个概念(数据库、表、全文索引目录、全文索引)之间的关系:

  其中,表与全文索引一一对应。每个表只能有一个全文索引,同时也只能属于一个全文索引目录。
注:SQL Server 2000 的Standard Edition 和Enterprise Edition 版本提供了对表数据中字符串的复杂检索功能---全文检索(Full-Text Searches)。此功能需要在安装时通过自定义安装选项来添加。

  一、 启动全文检索服务
    1. 从Enterprise Manager启动

    2. 从服务管理程序启动


  二、 创建全文索引目录
  
  1 在Enterprise Manager的目录树中选择要创建全文索引目录的数据库,右键单击“新建->新建全文目录”,显示如下图所示对话框:


  2. 在上图对话框中输入要创建的全文索引目录名称和文件存放位置。SQLServer 默认的存放目录是“安装目录\MSSQL\FTDATA”,在此目录下将为每个全文索引目录单独创建一个目录,目录名称与图中指定的名称不同,是由系统生成的。单击“调度” 页框,在该页框中点击“新建目录调度”则会出现如下图所示的全文索引目录调度对话框。


  

3. 在上图中可以创建、编辑全文索引目录执行计划。单击“确定”按钮,则创建全文索引目录。

  三、 创建全文索引
  1. 首先点选要创建全文索引的表,然后点击右键菜单中的“全文索引表->在表上定义全文索引”,启动全文索引向导
  2. 按照向导指示,选择建立索引的列,如下图所示:


  四、 全文检索查询

  进行全文检索需要在SELECT命令的WHERE语句中使用两个Transact-SQL谓词:CONTAINS和FRETEXT

  1.CONTAINS
  CONTAINS 谓词的语法如下
  CONTAINS ( { column_name | * } , < contains_search_condition > )
  < contains_search_condition > ::=
  { < simple_term >
  | < prefix_term >
  | < generation_term >
  | < proximity_term >
  | < weighted_term >
  }
  | { ( < contains_search_condition > )
  { AND | AND NOT | OR } < contains_search_condition > [ ...n ]
  }
  其含义是检索列中包含有符合< contains_search_condition >检索条件的信息。其中,“column_name”必须是包含在全文索引中的列,“*”表示检索条件应用到所有包含在全文索引中的列上。CONTAINS谓词的含义与LIKE谓词相似,但CONTAINS的功能更强大,支持更多的查询方式,并且对大小写不敏感。

  < contains_search_condition >检索条件可以为以下形式:

  (1)< simple_term > 单词或短语
  语法:< simple_term >::= word | phrase
  例1:查找公司名称中含有“technology”单词的公司信息
  select * from firms where contains(f_name,'technology')
  例2:查找公司介绍中含有“science and technology”短语或“information”单词的公司信息
  select * from firms where contains(f_intro,'"science and technology" or "information"')

  (2)< prefix_term > 单词或短语的前缀
  语法:< prefix_term >::= {"word*"|"phrase*"}
  例3:查找公司名称中含有以“info”开头的单词的公司信息
  select * from firms where contains(f_name,'"infor*"')

  (3)< generation_term >,单词及其变体
  语法: < generation_term >::= FORMSOF(INFLECTIONAL,<simple_term>[,...n])
  所谓单词的变体就是指由一个单词派生出的单词,如“go”单词的变体有“goes”等。
  例4:查找公司介绍中含有“limit”单词及其变体单词的公司信息
  select * from firms where contains(f_intro,'formsof(inflectional,limit)')

  (4)< proximity_term > 两个或多个位置靠近的单词
  语法:<proximity_term>::= {<simple_term>|<prefix_term>}
          {{NEAR|~}{<simple_term>|<prefix_term>}}[,...n]
  其中,“NEAR”与“~”的含义一致。
  例5:查找公司介绍中含有“software”单词,并且在其后面的文字中有“company”单词的公司信息。
  select * from firms where contains(f_intro,'"software" NEAR "company"')
  例6:查找公司介绍中含有“management”单词,并且在其后面的文字中有“system”,其前面的文字中有“MIS”单词的公司信息
  select * from firms where contains(f_intro,'"MIS" NEAR "management" NEAR "system"')

  (5)< weighted_term > 指定了权重的单词
  语法: < weighted_term >::=
      ISABOUT({{<simple_term>
          |<prefix_term>
          |<generation_term>
          |<proximity_term>}
         [WEIGHT(weight_value)]}[,...n])
  指定返回的查询结果必须与ISABOUT()中指定所有的单词或短语匹配,权重值weight_value是一个从0.0到1.0之间的数值,指定的是单词的匹配程度,在程序语句中使用时可以省略小数点前面的0。
  例:查找公司介绍中含有“software”、"system"、“infomation”等单词的公司信息,单词的权重分别为0.9、0.5、0.3。 
  select * from firms where contains(description,
         ISABOUT(software weight(.9),
         system weight(.5),
         information weight(.3)))

  2.FREETEXT
  FREETEXT谓词语法:FREETEXT({column_name|*},'freetext_string')
  FREETEXT谓词的含义与CONTAINS类似,但它比CONTAINT功能弱,只支持纯文字的搜索,即freetext_string只能为单词、短语或句子,不能使用逻辑表达式等。

返回



原文地址:http://warmwindow.nease.net/professionstyle/articles/database/20050617-01.htm
努力加载评论中...
点击右上角即可分享
微信分享提示