返回首页

简介
这篇文章是全文搜索功能的SQL Server 2000(2005)。它是一个易于使用,速度非常快,可扩展的解决方案索引和搜索文件"内容的各类的。例如在W​​ord,Excel中,Adobe的便携文档格式(PDF)和HTML文件。先决条件
通过这个例子,你需要的Microsoft SQL Server 2000服务器(至少)访问,数据库DB权利人,当然客户端工具。创建表
为了存储在数据库表中的索引文件,我们要创建两个表中的字段。第一个领域,我们将存储二进制格式的文件的内容,在第二,我们将存储该文件的扩展,例如quot;。docquot或quot;。xlsquot;。
这是一个好主意存储的全名和文件的大小信息,因为可能你需要在这些实际情况,但你不会需要全文索引。
存储的文件的大小可以是可选的,因为你可以查询,但是这可能需要很长一段时间,远远长于从一个字段读取这些值。
所以我们创建表的脚本可以:

CREATE TABLE [dbo].[Doc] (

 [ID]  uniqueidentifier ROWGUIDCOL  NOT NULL ,

 [Extension] [varchar] (10) NOT NULL ,

 [Content] [image] NOT NULL ,

 [FileSize] [int] NOT NULL ,

 [FileName] [nvarchar] (500) NOT NULL ,

 [Stamp] [timestamp] NOT NULL 

) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO



ALTER TABLE [dbo].[Doc] WITH NOCHECK ADD 

 CONSTRAINT [PK_Doc] PRIMARY KEY  CLUSTERED 

 (

  [ID]

 )  ON [PRIMARY] 

GO



ALTER TABLE [dbo].[Doc] ADD 

 CONSTRAINT [DF_Doc_ID] DEFAULT (newid()) FOR [ID]

GO

一个简单的想法是使用一个唯一的标识符类型的文件表的主键。它可以在许多情况下非常有用,如果你是一名Web开发人员。也许你想使用这个ID的URL(查询字符串),当你做出一个下载页面,你不想给机会你的用户下载的所有文件,没有看到您的广告, 等只需在URL的末尾增加一个参数。
请注意,已被该脚本创建一个主键。它始终是非常重要的,因为这样可以保证,你不能两个记录插入到数据库中(表是一组记录相同的ID,你不能使具有相同值的记录之间的差异,除了使用游标)和良好的聚集索引,才能真正提高SELECT语句的性能。
此外,有一个时间戳字段??所谓的邮票??在桌子上。这将是我们有必要,我们会谈论它。创建全文索引
我认为没有人知道正确的格式的全文索引头创建语句。因此,我们将创建此指数从Microsoft SQL Server企业管理器。
首先选择您的服务器,那么你的数据库。选择然后在右侧搜索,为您创建的表(DOC)的表。
右击表后,选择quot;上tablequot定义全文索引;子菜单,从quot;全文索引tablequot;菜单。{S0}
在这之后,一个向导将出现。
的quot;选择指数stepquot;,选择主键。后来,当我们查询表,我们将取回结果从全文搜索引擎(唯一的)索引的值。
在quot;选择表Columnsquot;,加强商标的quot; Contentquot;列,行,在文件类型列,选择领​​域的延伸。然后一步之遥到另一行,因为"下一步"按钮将被激活后,才改变选择。
在这一步,我们给了服务器的可转位列,并定义每个文件的类型。
在quot;选择一个Catalogquot;一步,你可以创建一个新的全文检索目录或选择一个现有的。我给您一个新的目录,对这些数据,因为所收集的索引可以是巨大的,如果文件数增加。
在quot;选择或创建人口Schedulesquot;,你可以安排的增量和目录或表的全部人口。你可以让它空在这种情况下,因为我们将使用更改跟踪功能的SQL Server。这意味着,我们告诉SQL服务器更新其文本目录quot; immediatelyquot;插入或更新后发生。
在实际情况中,它一般是每星期或每天提供一个完整的人口和增量每天或更频繁,但它取决于你的服务器的利用率。
的原因是,更改跟踪和增量更新功能不承认,如果有人使用WRITETEXT或UPDATETEXT语句。
当我们在设计表的时候,我们已经投入一个时间戳字段。增量索引更新时间戳字段是需要的,没有该领域的所有增量更新做全面的更新。全文索引引擎可以找到此属性的更改更新。这是因为WRITETEXT和UPDATETEXT语句是没有注意到的全文检索引擎。这些陈述不更新像正常插入的时间戳字段和更新做。
所以完成该向导,按下一步buttonnbsp;几次,然后完成。
已定义的全文索引后,我们必须将更改跟踪功能。我们可以通过右击在企业管理中的表名,然后选择更改跟踪然后quot;更新backgroundquot指数;从全文索引表菜单。从这个时候,全文索引引擎将改变观看我们的表,并更新其索引,如果必要。
我们的索引创建的一个有趣的结果:{C}测试
现在我们插入一些记录,然后我们创建一个选择查询。让我们在查询分析器中运行此插入脚本:
INSERT INTO [DOC] ([Extension], [Content], [FileSize], [FileName]) 

    VALUES ('.txt', 'Hello John! It''s me: Garfield!', 30, 'Cartoon1.txt')



INSERT INTO [Doc] ([Extension], [Content], [FileSize], [FileName]) 

    VALUES ('.txt', 'Oh my god!', 30, 'Shout.txt')



INSERT INTO [DOC] ([Extension], [Content], [FileSize], [FileName]) 

    VALUES ('.txt', 'NOWAN's web site: "%22http://www.nowan.hu/'%22">http://www.nowan.hu/', 30, 'nowan.txt')

这些都是简单的插入, 您可以检查自己。后插入的记录,你可以运行一个SELECT语句检查表:
SELECT * FROM [Doc]
全文搜索
要创建一个全文检索查询,您可以得到与未来报表更接近:
前两个语句有两个参数。首先是列名,第二个是搜索的字符串。这些职能还给布尔值。
第二个语句更有趣。这些函数返回的表有两列:KEY和RANK。这意味着,我们可以得到搜索记录或记录的唯一的ID,我们也可以回去的命中率(等级):
SELECT * FROM ContainsTable([doc], Content, '"nowan"')

CONTAINSTABLE和FREETEXTTABLE的另一个特点是,你可以给难以搜索的字符串表达式。例如,您可以使用quot; ORquot;和"; ANDquot;逻辑:{S3}
当然,这些语句的结果表中可以加入真正的表。因此,如果我们想从原始表中的原始数据行,我们可以使用这样的SELECT语句:
SELECT Doc.* FROM [Doc] 

    INNER JOIN ContainsTable([doc], Content, '"nowan"') AS FT 

    ON Doc.ID = FT.[Key]
索引的文件类型
的SQL Server创建索引通常从文本文件和Microsoft Office文件。这类型"列表中的IFilter扩展的设计为旧索引服务。您也可以从Adobe的IFilter索引PDF文件。匈牙利文版
您可以找到匈牙利文版的这篇文章{A6}。

回答

评论会员:elizas 时间:2011/12/06
包含是有条件的谓词和搜索包含基于字符的数据类型的列在where子句中使用

这个术语看起来这是在SQL查询提供一个特定的单词或词组匹配基本上它看起来完全匹配,但它可以延长或修改,以寻找屈折匹配。
基本语法:

CONTAINS({列| column_list中| *},"LT; search_conditionsgt;")

在上面:
- 第一个参数:可以采取所有列的列名或多个列名或"*"
。(请注意,可以结合表的多个列创建全文索引)

- 第二个参数:search_condition,我们可以把一个词或一个短语

{A7}
欢呼声,
伊丽莎
评论会员:elizas 时间:2011/12/06
包含是有条件的谓词和搜索包含基于字符的数据类型的列在where子句中使用

这个术语看起来这是在SQL查询提供一个特定的单词或词组匹配基本上它看起来完全匹配,但它可以延长或修改,以寻找屈折匹配。
基本语法:

CONTAINS({列| column_list中| *},"LT; search_conditionsgt;")

在上面:
- 第一个参数:可以采取所有列的列名或多个列名或"*"
。(请注意,可以结合表的多个列创建全文索引)

- 第二个参数:search_condition,我们可以把一个词或一个短语

{A7}
欢呼声,
伊丽莎
评论会员:游客 时间:2011/12/06
中银国际|尼斯的文章!我有几个问题,关于全文索引。我有300多万条记录的事务表。我想作为一个不断更新索引时添加新记录表,而不是删除并重新。我用CHANGE_TRACKING自动选项,同时创建索引,但似乎没有得到索引新记录。我也看过,索引更新,随时可能发生如果不立即。我想一些解决办法生效后的行添加到表,索引更新即刻发生。可以触发帮我在这?的问候,Pratik人们说DONT重新发明轮子,我说我有一个更好的轮
!会员2209858
评论会员:游客 时间:2011/12/06
!有趣的问题你必须有一个表上的时间戳。每次你改变你的记录,更新了吗?没有时间戳修改,索引引擎不会通知您的记录上的变化。在文章中:"codeprelang="SQL"spanclass="code-keyword"WriteText/span/pre/code和codeprelang="SQL"spanclass="code-keyword"UpdateText/span/pre/code语句是没有注意到的全文检索引擎"否则,这可能是一个基础设施的问题。您应该检查事件日志,索引问题或与的IFilter寻找问题。中银国际
您好亲爱的,
我的工作在SQLSERVER 2005年。
右击表后,"全文索引"选项卡不活跃。
请帮我解决问题
谢谢
评论会员:reej 时间:2011/12/06
您好,
在SQL Server Management Studio中选择你的数据库,在对象资源管理器,展开内容,并存储标签下,你可以找到全文目录。
用右键点击,你可以选择新的全文目录菜单。
伊什特万
评论会员:中银国际 时间:2011/12/06
有一个全文目录运行的数据库的大小限制?我使用SQL 2000和我的数据库是超过100 GB
评论会员:dadvir 时间:2011/12/06
在这种情况下有一些限制:
- 全文索引,一个单一的文件必须小于16兆字节大小,并不得含有超过256千字节过滤文本
。 - 全文唯一键的大小必须没有达到其最大的(450字节)
- 2147483643的行数,可以在一个单一的全文目录
限制我只发现了这些限制,但没有全文目录的大小。
否则,它是提供,使用的每一个巨大的表一个单独的目录。
评论会员:中银国际 时间:2011/12/06
字的内容是二进制和使用image数据类型必须保存
SQL Server知道如何搜索?
评论会员:月塞达 时间:2011/12/06
是。您还必须提供类似的二进制数据,在相同的记录(Word文档)的文件扩展名(DOC)。
因此,从这些信息中,SQL Server可以找到的二进制信息的内容类型并使用正确的索引服务IFilter的检索记录的文本内容。

评论会员:dfgdfd 时间:2011/12/06
!您好
这是正常的,但在mssql2k5全文仅适用于基本操作。有非常多的功能,它不是开放的定制。
我们的项目Dotnetjob.com几个月,我们使用内建的全文,但我们迁移到Lucene的,因为这是更更好,速度非常快(我们解析和索引超过5GB的文本数据/天和重新索引每5分钟) 。我们不能够定制我们的得分algoriths,全文是能够根据不同的语言和您的业务需求而定的其他条件的每一列的优先级。这就是为什么Monster.com,谷歌和IBM正在使用它,我会建议只使用基本的东西MSSQL内置FT。 Lucene是太棒了! {S4}的

的问候,



1月塞达
安全MVP
{A9}
评论会员:kookai 时间:2011/12/06
您好
我认为dotlucene是非常伟大的搜索者和类似甲骨文的文字
我希望,ü使用dotlucene UR搜索
哈米德kiyani感谢我们
评论会员:中银国际 时间:2011/12/06
为什么?
评论会员:kookai 时间:2011/12/06
您好,
我发现在microsoft.com的网页,它告诉泰语支持:{A10}]

"SQL Server 2000使用的语言资源包与全文检索目录下面的列表包含语言资源的语言为:
??中性
??荷兰
??英语(英国)
??英语(美国)
??法国
??德国
??意大利
??日本
??韩国
简体中文
??西班牙文(现代排序) - 西班牙
??瑞典
??繁体中文
??泰国"