热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

mssqlserverfulltext全文检索分析

文章介绍mssqlserverfulltext全文检索分析的主要是,全文索引只有在sql2000以后才能使用,有需要的朋友可要注意哦。

文章介绍mssqlserver fulltext全文检索分析的主要是,全文索引只有在sql2000以后才能使用,有需要的朋友可要注意哦。

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"是一样的。有这两个字符串的行都会被返回。

目录 MssqlFtdataSqlserverConfig 下提供了多种语言的干扰词列表。在安装带有全文检索支持的 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 ServerMSSQLFTDATASQLServerConfig目录里建一个非空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 ; @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
查询子句只包含被忽略的词

这种情况修改 MssqlFtdataSqlserverConfig 下对应语言的干扰词列表文件

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

SQL补丁下载:
x?displaylang=zh-cn&FamilyID=9032f608-160a-4537-a2b6-4cb265b80766">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. 右键你的表--全文索引表--更改跟踪,这样以后的修改会自动填充(有一定延迟)

先看一个实例sql2005的

代码如下

--查看当前数据库状态 1为已经启用了全文索引
SELECT DATABASEPROPERTY ('数据库名','IsFulltextEnabled')
--打开FullText功能
execute sp_fulltext_databse 'enable'
--关闭此功能
execute sp_fulltext_databse 'disable'
--创建全文索引目录
--删除全文目录 DROP FULLTEXT 目录名
CREATE FULLTEXT CATALOG 目录名
-- 每个表只可以有一个全文索引,存放在指定的索引目录里,可以通过向导创建,也可以通过SQL创建
-- indexname是指已存在的基于指定表的唯一索引名.而不是唯一索引列名.如果索引不存在,需要先创建唯一索引.
--删除全文索引 DROP FULLTEXT INDEX ON 表名
CREATE FULLTEXT INDEX ON 名称
(索引1,索引2...)
KEY INDEX indexname ON 表名
--全文索引查询
Select * from 表名
where contains( 列名, ' "202*" or "2*" ')
Select * from 表名
where FREETEXT( 列名, ' "202*" and "2*" ')
/*注:
FREETEXT语句的功能是在一个表的所有列或指定列中搜索一个自由文本格式的字符串,并
返回与该字符串匹配的数据行。所以,FREETEXT语句所执行的功能又称做自由式全文查询。

CONTAINS语句的功能
是在表的所有列或指定列中搜索:一个字或短语;一个字或短语的前缀;与一个字相近的另一
个字;一个字的派生字;一个重复出现的字。
*/


推荐阅读
  • Windows环境下Oracle数据库迁移实践
    本文详细记录了一次在Windows操作系统下将Oracle数据库的控制文件、数据文件及在线日志文件迁移至外部存储的过程,旨在为后续的集群环境部署做好准备。 ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • LoadRunner中的IP欺骗配置与实践
    为了确保服务器能够有效地区分不同的用户请求,避免多人使用同一IP地址造成的访问限制,可以通过配置IP欺骗来解决这一问题。本文将详细介绍IP欺骗的工作原理及其在LoadRunner中的具体配置步骤。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统上安装中文宋体字体的方法,包括操作系统的环境配置、字体管理工具的安装、字体文件的传输与缓存重建等步骤。 ... [详细]
  • 本文详细介绍了在PHP中如何获取和处理HTTP头部信息,包括通过cURL获取请求头信息、使用header函数发送响应头以及获取客户端HTTP头部的方法。同时,还探讨了PHP中$_SERVER变量的使用,以获取客户端和服务器的相关信息。 ... [详细]
  • 本文探讨了在使用 MyBatis 进行批量数据处理时遇到的参数绑定异常问题,并提供了详细的解决方案。 ... [详细]
  • 本文详细介绍了如何在Windows和Linux系统上配置Openfire服务器,包括安装步骤、数据库配置及端口映射等关键环节。 ... [详细]
  • PHP 图形函数中实现汉字显示的方法
    本文详细介绍了如何在 PHP 的图形函数中正确显示汉字,包括具体的步骤和注意事项,适合初学者和有一定基础的开发者阅读。 ... [详细]
  • 2023年1月28日网络安全热点
    涵盖最新的网络安全动态,包括OpenSSH和WordPress的安全更新、VirtualBox提权漏洞、以及谷歌推出的新证书验证机制等内容。 ... [详细]
  • 本文详细介绍了如何在PHP中使用Memcached进行数据缓存,包括服务器连接、数据操作、高级功能等。 ... [详细]
  • 本文由公众号【数智物语】(ID: decision_engine)发布,关注获取更多干货。文章探讨了从数据收集到清洗、建模及可视化的全过程,介绍了41款实用工具,旨在帮助数据科学家和分析师提升工作效率。 ... [详细]
  • 如何高效学习鸿蒙操作系统:开发者指南
    本文探讨了开发者如何更有效地学习鸿蒙操作系统,提供了来自行业专家的建议,包括系统化学习方法、职业规划建议以及具体的开发技巧。 ... [详细]
  • 实现Win10与Linux服务器的SSH无密码登录
    本文介绍了如何在Windows 10环境下使用Git工具,通过配置SSH密钥对,实现与Linux服务器的无密码登录。主要步骤包括生成本地公钥、上传至服务器以及配置服务器端的信任关系。 ... [详细]
  • 本文详细对比了HashMap和HashTable在多线程环境下的安全性、对null值的支持、性能表现以及方法同步等方面的特点,帮助开发者根据具体需求选择合适的数据结构。 ... [详细]
  • 本文列举了构建和运行 Struts2 应用程序所需的核心 JAR 文件,包括文件上传、日志记录、模板引擎等关键组件。 ... [详细]
author-avatar
mEmorIes-谨年一_950
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有