当前位置:数据库 > SQLServer >>

使用 Microsoft SQL Server 2000 的全文搜索功能构建 Web 搜索应用程序

答案:

使用 Microsoft SQL Server 2000 的全文搜索功能构建 Web 搜索应用程序
Andrew B. Cencini
Microsoft Corporation
2002年12月


适用于:
    Microsoft® SQL™ Server 2000

摘要:学习如何充分利用 SQL Server 2000 的全文搜索功能。本文包含有关实现最大吞吐率和最佳性能的几点提示和技巧。
目录简介 全文搜索功能简介 配置全文搜索功能 全文查询 排位和优化 其他性能技巧 小结 附录 A:实现全文搜索功能的最佳选择 附录 B:使用最佳选择、结果分页和有效全文查询逻辑的示例应用程序 附录 C:资源 简介
使用 Microsoft® SQL™ Server 2000 的全文搜索功能,可以对在非结构化文本数据上生成的索引执行快速、灵活的查询。常用的全文搜索工具是网站的搜索引擎。为了帮助读者理解全文搜索功能的最佳使用方法,本文介绍了大量抽象概念;并对优化全文索引和查询以实现最大吞吐率和最佳性能,提供了几点提示和技巧。
全文搜索功能简介
全文搜索功能在 SQL Server 7.0 中引入。全文搜索的核心引擎建立在 Microsoft Search (MSSearch) 技术上,Microsoft Exchange 和 Microsoft SharePoint™ Portal Server 等产品中也采用了此项技术。

SQL Server 7.0 全文搜索中公开的功能可提供基本的文本搜索功能,并使用早期版本的 MSSearch;而 SQL Server 2000 的全文搜索实现则包含一组可靠的索引和查询功能,并在 SQL Server 7.0 的基础之上添加了几项增强功能。这些增强功能包括:通过 Microsoft 群集服务完全支持群集操作,能够过滤和索引 IMAGE 列中存储的文档,提供改进的语言支持,以及在性能、可缩放性和可靠性方面进行了改进。

MSSearch 生成、维护和查询文件系统中(而不是 SQL Server 中)存储的全文索引。MSSearch 进行全文索引时使用的逻辑和物理存储单元是目录。全文目录在每个数据库中包含一个或多个全文索引 - 可以为 SQL Server 中的每个表创建一个全文索引,且索引中可以包含该表中的一列或多列。每个表只能属于一个目录,且每个表只能创建一个索引。我们将简单介绍有关组织全文目录和索引的最佳方案 - 但首先,让我们来简单了解一下全文搜索的工作原理。
配置全文搜索功能
要为 SQL Server 中存储的文本数据创建全文索引,应该先完成以下几步准备工作。第一步是以全文方式启用包含要生成索引的文本数据的数据库(如果您尚未执行此操作)。
注意:执行以下语句将丢弃并重新创建属于要启用全文搜索的数据库的所有全文目录。除非要重新创建全文目录,否则请确保在要启用的特定数据库中未创建任何全文目录。
如果您是 sysadmin 角色的成员或此数据库的 db_owner,可以继续进行并发出以下语句:

use Northwind exec sp_fulltext_database 'enable'

接下来,您需要创建全文目录,以存储全文索引。正如前面所提到的,此目录中的数据存储在文件系统中(而不是 SQL Server 中),因此,在考虑全文目录的存储位置时应该仔细选择。除非指定其他位置,否则全文目录将存储在 FTDATA 目录(位于 Microsoft SQL Server\MSSQL 存储位置中)的子目录中。以下是在非默认位置创建全文目录的方法:

exec sp_fulltext_catalog 'Cat_Desc', 'create', 'f:\ft'

在本例中,全文目录将创建为“f:\ft”的子目录,如果您查看文件系统的该部分,将看到它有了自己的目录。MSSearch 使用的全文目录的命名规则是:

SQL+dbid+catalogID

目录 ID 从 00005 开始,并且每新建一个目录就递增 1。

如果可能的话,最好在其所在的物理驱动器上创建全文目录。如果生成全文索引的进程需要进行大量的 I/O 操作(具体而言,就是从 SQL Server 中读取数据,然后向文件系统写入索引),则应避免使 I/O 子系统成为瓶颈。

那么,全文目录有多大呢?通常情况下,全文目录的系统开销比 SQL Server 中存储的数据(对其进行全文索引)量高出大约 30%;但是,此规则取决于数据中唯一单词(或主键)的分布,以及被您视为是干扰词的单词的分布。干扰词(或终止词)是指要排除在全文索引和查询以外的词语(因为它们不是您感兴趣的搜索词,而且出现频率很高,所以只会使索引变得很大,而不会有实际效果)。稍后,我们将介绍有关干扰词选择方面的注意事项,以及如何优化干扰词以改善查询性能。

如果您尚未执行此操作,请在每个要生成全文索引的表上创建一个唯一的单列非空索引。这个唯一索引用于将表中的每一行映射到 MSSearch 内部使用的一个唯一可压缩主键。接下来,您需要让 MSSearch 知道您要为表创建全文索引。对表发出以下语句可将该表添加到所选的全文目录中(在本例中,它是我们在前面创建的“Cat_Desc”):

exec sp_fulltext_table 'Categories', 'create', 'Cat_Desc', 'PK_Categories'

下一步是向此全文索引添加列。您可以为每一列选择一种语言,如果该列的类型为 IMAGE,则必须再指定一列,以指示 IMAGE 列的每一行中存储的文档类型。

在列语言选择方面,有一些重要但尚未成文的注意事项。这些注意事项与文本的标记方式以及 MSSearch 对文本的索引方式有关。被索引的文本是通过一个称作单词分隔符(用作单词边界标记)的组件提供的。在英文中,单词分隔符通常是空格或某种形式的标点符号;而在其他语言中(例如德语),单词或字符可以组合在一起;因此,所选的列语言应表示要存储在该列的行中的语言。如果不确定,最好的方法通常是使用中性单词分隔符(只使用空格和标点符号执行标记功能)。选择列语言的另一个好处是“寻根溯源”。全文查询中的寻根溯源是指在特定语言中搜索某一单词的所有变化形式的过程。

选择语言的另一个考虑因素与数据的表示方法有关。对于非 IMAGE 列数据来说,不需要执行特殊的过滤操作;而文本通常需要将单词分隔组件按原样传递。单词分隔符主要用于处理书面文本。因此,如果文本中有任何类型的标记(例如 HTML),则在索引和搜索过程中,语言精确性将不会很高。这种情况下,您有两种选择 - 首选方法是只将文本数据存储在 IMAGE 列中,并指明其文档类型,以便对其进行过滤。如果不选择此方法,则可以考虑使用中性单词分隔符,并且可能的话,在干扰词列表中添加标记数据(例如 HTML 中的“br”)。在指定了中性语言的列中不能进行任何基于语言的寻根溯源,但有些环境可能会要求您选择此方法。

在知道列选项后,通过发出以下语句在全文索引中添加一列或两列:

exec sp_fulltext_column 'Categories', 'Description', 'add'

您可能注意到,此处未指定任何语言 - 这种情况下,将使用默认的全文语言。可以通过系统存储过程“sp_configure”为服务器设置默认全文语言。

将所有列添加到全文索引后,即可执行填充操作。填充方法之多实在是不胜枚举,此处不作详细介绍。在本例中,只需对表启动完全填充,并等待它执行完毕:

exec sp_fulltext_table 'Categories', 'start_full'

您可能希望使用 FULLTEXTCATALOGPROPERTY 或 OBJECTPROPERTY 函数来监视填充状态。要获取目录填充状态,可以执行:

select FULLTEXTCATALOGPROPERTY('Cat_Desc', 'Populatestatus')

通常情况下,如果完全填充正在进行,则返回的结果是“1”。有关如何使用 FULLTEXTCATALOGPROPERTY 和 OBJECTPROPERTY 的详细信息,请参阅 SQL Server Books Online。
全文查询
查询全文索引与执行 SQL Server 中的标准关系型查询略有不同。由于索引是在 SQL Server 外部进行存储和管理的,因此全文查询处理大部分由 MSSearch 完成(因此,那些一部分是关系型、一部分基于全文的查询将被单独处理),这样做有时会损害性能。

从本质上说,执行全文查询时,查询词传递给 MSSearch,后者遍历其内部数据结构(索引),并向 SQL Server 返回主键和排位值。如果执行 CONTAINS 或 FREETEXT 查询,则通常看不到主键或排位值,但如果执行 CONTAINSTABLE 或 FREETEXTTABLE 查询,则将获得这些值,然后这些值通常会与基表合并在一起。与基表合并主键的进程需要很高的系统开销 - 稍后,我们将向您介绍一些巧妙的方法以尽量减少或完全避免这种合并。

如果您通过不断思考,对全文查询如何返回数据有了一个初步了解,就可以推测出 CONTAINS/FREETEXT 查询仅执行 CONTAINSTABLE/FREETEXTTABLE 查询并与基表进行合并。有了这样的了解,您应该避免使用这些类型的查询,除非不这样做的开销更高。在 Web 搜索应用程序中,使用 CONTAINSTABLE 与 FREETEXTTABLE 比使用不带 TABLE 的同类函数好得多。

到现在为止,您已经知道全文查询是用来从 SQL Server 之外存储的 MSSearch 索引中访问数据的特殊方法,还知道如果盲目地与基表进行合并,就会遇到麻烦。应该了解的另外一个重要内容是 CONTAINS 样式查询与 FREETEXT 样式查询之间的本质差别。

CONTAINS 查询用于对所查询的所有词语执行完全匹配查询。无论您只查找单个单词,还是查找以“orange”开头的所有单词,系统只返回包含所有搜索词的结果。因此,CONTAINS 查询速度很快,因为它们通常返回很少的结果,并且不需要执行过多的附加处理。CONTAINS 查询的缺点包括令人生厌的干扰词过滤问题。经验丰富的开发人员以及过去使用过全文搜索的数据库管理员,在试图匹配只包含单个干扰词的单词或词组时,曾遇到过“您的查询只包含干扰词”这样令人吃惊的错误。要避免收到此错误,方法之一是在执行全文查询之前过滤出干扰词。向包含干扰词的 CONTAINS 查询返回结果是不可能的,因为此类查询只返回与整个查询字符串完全匹配的结果。由于干扰词不是全文索引项,因此包含干扰词的 CONTAINS 查询不会返回任何行。

FREETEXT 查询消除了 CONTAINS 查询中偶尔出现的所有警告说明。当发出 FREETEXT 查询时,实际上发出的是词根查询。因

上一个:ADO Data Types与数据库值对应
下一个:如何在SQL中启用全文检索功能?(实例)

Oracle
MySQL
Access
SQLServer
DB2
Excel
SQLite
SYBASE
Postgres
如果你遇到数据库难题:
请访问www.zzzyk.com 试试
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,