共计 5651 个字符,预计需要花费 15 分钟才能阅读完成。
SQLServer 怎样全文检索 full-text 语法,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面丸趣 TV 小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
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,所在的行与 ProductID6 关联。该索引结构支持对所有包含被索引单词的项进行有效检索,以及高级检索操作,如短语检索和邻近检索。为防止全文索引因包含很多对检索没有帮助的词而变得臃肿,a、and、is 或 the 这类额外的词都忽略不计。例如,指定 theproductsorderedduringthesesummermonths 与指定 productsorderedduringsummermonths 是一样的。有这两个字符串的行都会被返回。目录 \Mssql\Ftdata\Sqlserver\Config 下提供了多种语言的干扰词列表。在安装带有全文检索支持的 Microsoft reg;SQLServer™时会创建这个目录,并同时安装干扰词文件。干扰词文件可以编辑。例如,高技术公司的系统管理员可以把单词 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 瑞典语在处理全文查询时,检索引擎将满足检条件的行的键值返回给 MicrosoftSQLServer。比如有一个 SciFi 表,其中 Book_No 列是主键列。Book_NoWriterTitle———————————————A025AsimovFoundation sEdgeA027AsimovFoundationandEmpireC011ClarkeChildhood sEndV109VerneMysteriousIsland 假定想使用一个全文检索查询来查找包含单词 Foundation 的书名。在本例中,将从全文索引获得值 A025 和 A027。然后 SQLServer 用这些键值和其它栏的信息响应该查询。下表显示了存储全文索引数据所使用的语言。这些语言基于 SQLServer 安装期间选择的 Unicode 排序规则区域设置标识符。Unicode 排序规则区域设置标识符全文数据存储所用的语言 —————————————————— 中文注音符号(台湾)繁体中文汉语拼音简体中文中文笔画简体中文中文笔画(台湾)繁体中文荷兰语荷兰语英语(英国)英语(英国)法语法语通用 Unicode 英语(美国)德语德语德文电话簿德语意大利语意大利语日语日语日语 Unicode 日语韩文韩文韩文 Unicode 韩文西班牙语(现代)西班牙语瑞典 / 芬兰语瑞典语此列表中没有的其它所有 Unicode 排序规则区域设置标识符值都映射到使用空格分隔单词的中性语言单词的断字符和词干分隔符。说明 Unicode 排序规则区域设置标识符设置用于所有可进行全文索引的数据类型(如 char、nchar 等)。如果为 char、varchar 或 text 类型列的排序次序设置的语言类型,不是 Unicode 排序规则区域设置标识符语言,那么在对 char、varchar 和 text 类型的列进行全文索引和查询时,仍然使用 Unicode 排序规则区域设置标识符值。创建全文索引 (以索引 image 列为例, 其他类型字段大致一样) 标题全文索引 image 列,全攻略!作者 pengdali[原作]关键字全文索引 image 今天“百年不遇”的停电了,看了一天书。晚上搞了一下全文索引,决定把心得贴出来,我尽量写的详细,大家共同学习,欢迎指正!1、启动 MicrosoftSearch 服务开始菜单 – SQL 程序组 – 服务管理器 – 下拉筐 – MicrosoftSearch 服务 – 启动它 2、..\MicrosoftSQLServer\MSSQL\FTDATA\SQLServer\Config\ 目录里建一个非空 noise.chs 文件非空 noise.chs 文件,也有人说是空的 noise.chs 文件,但我每次都往里写几个没用的字母。3、建立环境打开查询分析器 – 执行下列脚本:——————————————–createdatabasetest— 创建 test 数据库 usetest— 选择 test 数据库 createtabledali(IDintnotnullprimarykey,MyImageimage,FileTypevarchar(255),FileNmaevarchar(255))— 创建 dali 表 –dali 表中 Id,MyImage,FileType 三列是必须的,因为要对 image 列索引的话,必须要有一个主键列,一个 image 列, 一个存放文件类型的列 – 我们知道在 windows 系统中文件类型是靠扩展名来区分的所以 FileType 列也就是用来放文件的扩展名 ——————————————–sp_fulltext_database enable – 为全文索引启用数据库 sp_fulltext_catalog My_FullDir , create — 创建一个叫 My_FullDif 的全文目录 declare@Keysysname;select@Key=c.namefromsyscolumnsa,sysconstraintsb,sysobjectscwherea.id=object_id(dali)anda.name= ID anda.id=b.idandb.constid=c.idandc.namelike PK% execsp_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、插入数据建立下面这个存储过程 ————————————————–CREATEPROCEDUREsp_textcopy@srvnamevarchar(30),@loginvarchar(30),@passwordvarchar(30),@dbnamevarchar(30),@tbnamevarchar(30),@colnamevarchar(30),@filenamevarchar(30),@whereclausevarchar(40),@directionchar(1)AS/* 这是使用 textcopy 工具将文件插入到数据库中,如果有前台工具可以用前台开发工具将文件插入,这里为了演示 */DECLARE@exec_strvarchar(255)SELECT@exec_str= textcopy/S +@srvname+ /U +@login+ /P +@password+ /D +@dbname+ /T +@tbname+ /C +@colname+ /W +@whereclause+ /F +@filename+ / +@directionEXECmaster..xp_cmdshell@exec_str—————————————————-insertdalivalues(1,0x, doc , 大力的 doc)— 其中第二列是 0x 它是一个 16 进制数对应 image 列, 是必须的, 不要写 null, 第三列是文件类型,既扩展名 sp_textcopy 你的服务器名 , sa , 你的密码 , test , dali , MyImage , c:\ 大力的 doc.doc , whereID=1 , I ——- 依次参数是:实例名, 用户名, 密码,数据库名,表名,image 列名,路径及文件名,条件(你必须保证它只选择一行),I———————————————————————————————————————insertdalivalues(2,0x, bmp , 图片)sp_textcopy 你的服务器名 , sa , 你的密码 , test , dali , MyImage , c:\ 图片.bmp , whereID=2 , I – 注意条件是 ID=2insertdalivalues(3,0x, xls , Excel 文件)sp_textcopy 你的服务器名 , sa , 你的密码 , test , dali , MyImage , c:\Excel 文件.xls , whereID=3 , I – 注意条件是 ID=3insertdalivalues(4,0x, htm , 网页)sp_textcopy 你的服务器名 , sa , 你的密码 , test , dali , MyImage , c:\ 网页.htm , whereID=4 , I – 注意条件是 ID=4———- 上面的语句, 要保证类型一样,路径正确,条件唯一正确应该就可以了 6、填充全文索引 sp_fulltext_table dali , start_full — 第一个参数是表名,第二个参数是启动表的全文索引的完全填充 7、可以开始你的实验了 select*fromdaliwherecontains(MyImage, J 老师)select*fromdaliwherecontains(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 列的全文检索
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注丸趣 TV 行业资讯频道,感谢您对丸趣 TV 的支持。