对二进制文件实现全文检索

it2022-05-05  86

引用﹕ 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高级服务器 導入導出二進制文件 /*--bcp   实现二进制文件的导入导出 支持image,text,ntext字段的导入/导出 image适合于二进制文件,包括:Word文档,Excel文档,图片,音乐等 text,ntext适合于文本数据文件 注意:导入时,将覆盖满足条件的所有行 导出时,将把所有满足条件的行导出到指定文件中 此存储过程仅用bcp实现 邹建   2003.08-----------------*/ /*--调用示例 --数据导出 exec   p_binaryIO   'zj ', ' ', ' ', 'acc_演示数据..tb ', 'img ', 'c:\zj1.dat ' --数据导入 exec   p_binaryIO   'zj ', ' ', ' ', 'acc_演示数据..tb ', 'img ', 'c:\zj1.dat ', ' ',0 --*/ if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N '[dbo].[p_binaryIO] ')   and   OBJECTPROPERTY(id,   N 'IsProcedure ')   =   1) drop   procedure   [dbo].[p_binaryIO] GO Create   proc   p_binaryIO @servename   varchar   (30),--服务器名称 @username   varchar   (30),   --用户名 @password   varchar   (30), --密码 @tbname   varchar   (500),   --数据库..表名 @fdname   varchar   (30),   --字段名 @fname   varchar   (1000), --目录+文件名,处理过程中要使用/覆盖:@filename+_temp @tj   varchar   (1000)= ' ',   --处理条件.对于数据导入,如果条件中包含@fdname,请指定表名前缀 @isout   bit=1 --1导出((默认),0导入 AS   declare   @fname_in   varchar(1000) --bcp处理应答文件名 ,@fsize   varchar(20) --要处理的文件的大小 ,@m_tbname   varchar(50) --临时表名 ,@sql   varchar(8000) --则取得导入文件的大小 if   @isout=1   set   @fsize= '0 ' else begin create   table   #tb(可选名   varchar(20),大小   int ,创建日期   varchar(10),创建时间   varchar(20) ,上次写操作日期   varchar(10),上次写操作时间   varchar(20) ,上次访问日期   varchar(10),上次访问时间   varchar(20),特性   int) insert   into   #tb exec   master..xp_getfiledetails   @fname select   @fsize=大小   from   #tb drop   table   #tb if   @fsize   is   null begin print   '文件未找到 ' return end end --生成数据处理应答文件 set   @m_tbname= '[##temp '+cast(newid()   as   varchar(40))+ '] ' set   @sql= 'select   *   into   '+@m_tbname+ '   from( select   null   as   类型 union   all   select   0   as   前缀 union   all   select   '+@fsize+ '   as   长度 union   all   select   null   as   结束 union   all   select   null   as   格式 )   a ' exec(@sql) select   @fname_in=@fname+ '_temp ' ,@sql= 'bcp   " '+@m_tbname+ ' "   out   " '+@fname_in + ' "   /S " '+@servename +case   when   isnull(@username, ' ')= ' '   then   ' '   else   ' "   /U " '+@username   end + ' "   /P " '+isnull(@password, ' ')+ ' "   /c ' exec   master..xp_cmdshell   @sql --删除临时表 set   @sql= 'drop   table   '+@m_tbname exec(@sql) if   @isout=1 begin set   @sql= 'bcp   "select   top   1   '+@fdname+ '   from   '   +@tbname+case   isnull(@tj, ' ')   when   ' '   then   ' ' else   '   where   '+@tj   end + ' "   queryout   " '+@fname + ' "   /S " '+@servename +case   when   isnull(@username, ' ')= ' '   then   ' '   else   ' "   /U " '+@username   end + ' "   /P " '+isnull(@password, ' ') + ' "   /i " '+@fname_in+ ' " ' exec   master..xp_cmdshell   @sql end else begin --为数据导入准备临时表 set   @sql= 'select   top   0   '+@fdname+ '   into   ' +@m_tbname+ '   from   '   +@tbname exec(@sql) --将数据导入到临时表 set   @sql= 'bcp   " '+@m_tbname+ ' "   in   " '+@fname + ' "   /S " '+@servename +case   when   isnull(@username, ' ')= ' '   then   ' '   else   ' "   /U " '+@username   end + ' "   /P " '+isnull(@password, ' ') + ' "   /i " '+@fname_in+ ' " ' exec   master..xp_cmdshell   @sql --将数据导入到正式表中 set   @sql= 'update   '+@tbname + '   set   '+@fdname+ '=b. '+@fdname + '   from   '+@tbname+ '   a, ' +@m_tbname+ '   b ' +case   isnull(@tj, ' ')   when   ' '   then   ' ' else   '   where   '+@tj   end exec(@sql) --删除数据处理临时表 set   @sql= 'drop   table   '+@m_tbname end --删除数据处理应答文件 set   @sql= 'del   '+@fname_in exec   master..xp_cmdshell   @sql go

转载于:https://www.cnblogs.com/vibratea/archive/2010/09/16/1827726.html

相关资源:各显卡算力对照表!

最新回复(0)