SQLServer 全文检索(full-text)语法

sql server 全文检索有两种搜索方式,一种是contains,另一种是freetext。前者是包含,类似于

like '%关键词%',后者则是将一段文字分词以后对每个词进行搜索。

具体语法:
contains:

SELECT 字段1,字段2
FROM 表名
WHERE contains(字段,'"词一" or "词二"')

根据查找结果的相似度排序
SELECT 字段1,字段2
FROM 表名
inner join containstable(表名, 字段,'"词一" or "词二"',10) as k
on 表名.id = k.[key]
order by k.RANK DESC

freetext:

SELECT 字段1,字段2
FROM 表名
WHERE freetext(字段,'词一词二')

根据查找结果的相似度排序
SELECT 字段1,字段2
FROM 表名
inner join freetexttable(表名, 字段,'词一词二',10) as k
on 表名.id = k.[key]
order by k.RANK DESC

上文中freetexttable或containstable的10表示取10条数据

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

全文索引和查询概念(摘自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列的全文检索

(0)

相关推荐

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

    /*打开全文索引支持,启动SQL Server的全文搜索服务 */ execute sp_fulltext_database 'enable' /*创建全文目录*/ EXEC SP_FULLTEXT_CATALOG 'FT_testData','CREATE' /*建立全文索引数据元*/ EXEC sp_fulltext_table 'Hc_Book_Book','CREATE','FT_testData','PK_Hc_Book_BookInfo' /*添加支持全文索引的列名*/ EXEC s

  • SqlServer 2005 简单的全文检索

    复制代码 代码如下: --查看当前数据库状态 1为已经启用了全文索引 SELECT DATABASEPROPERTY ('数据库名','IsFulltextEnabled') --打开FullText功能 execute sp_fulltext_databse 'enable' --关闭此功能 execute sp_fulltext_databse 'disable' --创建全文索引目录 --删除全文目录 DROP FULLTEXT 目录名 CREATE FULLTEXT CATALOG 目录

  • 全文检索技术 sql server

    在未做全文检索以前,个人主页只能对Fs_Title(文章标题)字段进行模糊查询(like '%*%'),如果对内容进行模糊查询,速度极慢,有时还可能报错,今天终于有空了,把这个查询做好了,经过测 试,检索一万条纪录不到两秒时间.ENJOY~~ 复制代码 代码如下: use  LuanLuanDB exec sp_fulltext_database 'enable' exec sp_fulltext_catalog 'ArtileFullText', 'create', 'E:\SearchPag

  • SQL Server全文检索查询浅析

    方案概要: 1. 改变文件存储时的文件名 2. 配置索引服务器,并将索引服务器与MS SQL Server关联. 3. 修改SQL语句,将进行全文查询语句的内容加入查询条件中 文件的存储方式: 为了方便存储以及方便索引,我们将上传的文件存储到一个目录里面,为了保证上传的文件名不重复,采用GUID作为文件名,并且通过这个GUID于数据库记录相关联.同时,文件的后缀还保持原始文件的后缀,让索引服务能够识别该文档. 配置索引服务 进入计算机管理(Computer Management)程序(右键"我的

  • SQLServer 全文检索(full-text)语法

    sql server 全文检索有两种搜索方式,一种是contains,另一种是freetext.前者是包含,类似于 like '%关键词%',后者则是将一段文字分词以后对每个词进行搜索. 具体语法: contains: SELECT 字段1,字段2 FROM 表名 WHERE contains(字段,'"词一" or "词二"') 根据查找结果的相似度排序 SELECT 字段1,字段2 FROM 表名 inner join containstable(表名, 字段,

  • SQLServer 2005 和Oracle 语法的一点差异小结

    1.获取系统当前时间 SQL Server 2005: select getdate() Oracle: select sysdate from dual 2.获取年月日 SQL Server 2005: 复制代码 代码如下: select year(getdate()) --2011 select month(getdate()) --3 select day(getdate()) --23 Oracle: 复制代码 代码如下: select to_char(sysdate,'yyyy') f

  • 『jQuery』.html(),.text()和.val()的概述及使用

    本节内容主要介绍的是如何使用jQuery中的.html(),.text()和.val()三种方法,用于读取,修改元素的html结构,元素的文本内容,以及表单元素的value值的方法.jQuery中为我们提供了多种方法用于对元素的HTML结构和元素的文本内容的操作,比如说,你可以给已存在的元素的内部,周围,前面或者后面增加新元素:或者用一个元素替代另一个元素:你也可以读取或者修改一个元素的内容或结构.有时我们就会比较模糊,不知道是给元素增加内容或者增加一个元素,比如说我们需要给一个存在的元素有效的

  • 详解ASP.NET MVC3:Razor的@:和语法

    这是我正在写的博文系列中的另一篇,涵盖ASP.NET MVC 3的一些新功能: http://weblogs.asp.net/scottgu/archive/2010/10/19/asp-net-mvc-3-new-model-directive-support-in-razor.aspx Razor中的布局10月22日) 用Razor实现服务器端注释(11月12日) Razor的@:和<syntax>语法(今天) 本文将讨论新版Razor里视图引擎中支持的两个有用的语法功能:@:和<t

  • 关于对MongoDB索引的一些简单理解

    目录 索引简介 1.语法准备 2.数据准备: 3.索引 3.1 唯一索引 3.2 单键索引 3.3 多键索引 3.4 复合索引 3.5 交叉索引 3.6 部分索引 3.7覆盖索引 3.8 全文索引 4.索引限制 4.1 查询限制 4.2 范围限制 总结 索引简介 索引可以提升文档的查询速度,但建立索引的过程需要使用计算与存储资源,在已经建立索引的前提下,插入新的文档会引起索引顺序的重排. MongoDB 的索引是基于 B-tree 数据结构及对应算法形成的.树索引存储特定字段或字段集的值,按字段

  • ASP.NET、ASP、PHP、JSP之间有什么区别?

    Asp:      首先说Asp,它是属于脚本语言,一般连接的数据库为 Access 和 MsSql(SqlServer).当我们开发一个一般的小型数据库网站的时候,一般在3万条记录以下的,一般用Access数据库.      Access数据库的优势就是一般的服务器都支持.      SqlServer数据库的优势就是速度快,比如当记录集在10万以上,可以推荐用Sql的数据库. 这两种数据库在Asp中都是用Sql语法,但Access数据库和SqlServer数据库的使用语法有一定的不同. 在制

  • SQL Update多表联合更新的方法

    有些时候我们需要同时更新多个表中的数据那么就需要用到下面方法了: (1) sqlite 多表更新方法 复制代码 代码如下: //---------------------------------- update t1 set col1=t2.col1 from table1 t1 inner join table2 t2 on t1.col2=t2.col2 这是一个非常简单的批量更新语句 在SqlServer中支持此语法 sqlite中却不支持 sqlite中可转换为 如下语法 复制代码 代码

  • 必须收藏的23个php实用代码片段

    在编写代码的时候有个神奇的工具总是好的!下面这里收集了 40+ PHP 代码片段,可以帮助你开发 PHP 项目. 这些 PHP 片段对于 PHP 初学者也非常有帮助,非常容易学习,让我们开始学习吧- 1. 发送 SMS 在开发 Web 或者移动应用的时候,经常会遇到需要发送 SMS 给用户,或者因为登录原因,或者是为了发送信息.下面的 PHP 代码就实现了发送 SMS 的功能. 为了使用任何的语言发送 SMS,需要一个 SMS gateway.大部分的 SMS 会提供一个 API,这里是使用 M

  • 46 个非常有用的 PHP 代码片段

    这些 PHP 片段对于 PHP 初学者也非常有帮助,非常容易学习,让我们开始学习吧- 1. 发送 SMS 在开发 Web 或者移动应用的时候,经常会遇到需要发送 SMS 给用户,或者因为登录原因,或者是为了发送信息.下面的 PHP 代码就实现了发送 SMS 的功能. 为了使用任何的语言发送 SMS,需要一个 SMS gateway.大部分的 SMS 会提供一个 API,这里是使用 MSG91 作为 SMS gateway. function send_sms($mobile,$msg) { $a

  • 必须收藏的php实用代码片段

    在编写代码的时候有个神奇的工具总是好的!下面这里收集了 40+ PHP 代码片段,可以帮助你开发PHP 项目. 之前已经为大家分享了<必须收藏的23个php实用代码片段>. 这些PHP 片段对于PHP 初学者也非常有帮助,非常容易学习,让我们开始学习吧- 24. 从 PHP 数据创建 CSV 文件 function generateCsv($data, $delimiter = ',', $enclosure = '"') { $handle = fopen('php://temp'

随机推荐