解析:怎样使其他用户能够发出全文查询
本示例说明怎样使用 SQL Server 服务管理器使其他用户得以对 writers 表和 books 表发出全文查询。writers 表和 books 表是位于 pubs 数据库中的虚构的表。
使用 SQL Server 服务管理器验证全文服务 Microsoft 搜索是否在运行。
若有必要,可以按以下方式之一启动和停止该服务:
◆使用 SQL Server 企业管理器中的"全文检索"服务的快捷菜单。
◆使用 SQL Server 服务管理器中的 Microsoft 搜索服务。
◆在命令提示符处键入 net start mssearch。
2.执行下列语句,以查明是否已为全文处理启用了 pubs 数据库:
SELECT DatabaseProperty ('Pubs', 'IsFulltextEnabled' ) |
如果已启用全文支持,该语句返回 1,否则返回 0。
3.如果尚未启用全文支持(这是新建数据库的默认设置),则需为全文处理启用 pubs 数据库。使用 pubs 时,执行下列存储过程:
sp_fulltext_database 'enable' |
4.通过在 pubs 数据库中执行下列存储过程,创建一个名为 PubsCatalog 的全文目录作为候选的默认目录:
sp_fulltext_catalog 'PubsCatalog', 'create' |
这将在数据库系统表中创建有关全文目录的元数据,并在文件系统中生成空的全文目录。
5.为全文处理注册 writers 表和 books 表,方法是对每个表分别执行一次下列存储过程:
sp_fulltext_table 'writers', 'create', 'PubsCatalog', 'writer_id_index'sp_fulltext_table 'books', 'create', 'PubsCatalog', 'isbn_index' |
两个表都使用 PubsCatalog 全文目录。这些存储过程调用创建有关这两个全文索引的元数据。
6.为每个表指定要支持全文查询的列的名称,方法是对每列分别执行一次下列存储过程:
sp_fulltext_column 'writers', 'organization', 'add' sp_fulltext_column 'writers', 'bio', 'add' sp_fulltext_column 'books', 'writer_name', 'add' sp_fulltext_column 'books', 'the words', 'add' sp_fulltext_column 'books', 'abstract', 'add' |
说明: 为了说明起见,故意犯了如下错误:对于 books 表来说,注册的是 writer_name 列,而不是 titles 列。
这些存储过程调用增加有关两个全文索引的元数据。
7.为这些表创建全文索引,方法是对每个表分别执行一次下列存储过程:
sp_fulltext_table 'writers', 'activate'sp_fulltext_table 'books', 'activate' |
这样做实际上并不创建全文索引,而是在全文目录中注册这些表,使来自这些表的数据将被包含在下一次填充中。
8.启动对 PubsCatalog 全文目录的完全填充,方法是执行下列存储过程:
sp_fulltext_catalog 'PubsCatalog', 'start_full' |
因为全文目录的填充是一种异步操作,所以不大可能立即创建出全文索引。
9.执行下列语句以验证 PubsCatalog 全文目录填充的进度:
SELECT FulltextCatalogProperty ( 'PubsCatalog', 'PopulateStatus') |
如果全文目录的服务空闲并因此完成填充,则返回 0;否则返回 1 或更大的值以表示填充阶段。
10.发出 Transact-SQL 查询以确认管理任务执行无误。例如:
SELECT B.writer_name, B.pub_date, B.the_words, A.royalties_ytdFROM writers A, books BWHERE A.writer_name = B.writer_nameAND A.citizenship = 'Canadian'AND CONTAINS (B.the_words, '"Indexing Service" NEAR "Indexing Service"')SELECT writer_name, pub_date, abstractFROM books WHERE CONTAINS (title, '"Classic" NEAR "French" NEAR "Cooking"') |
最后一条查询结果是错误的,因为没有为全文查询启用 title 列。
11.执行下列语句以检查错误:
SELECT ColumnProperty ( ObjectId('books'), 'title', 'IsFullTextIndexed' ) |
12.通过执行下列存储过程,列出参与对 books 表进行全文处理的列:
sp_help_fulltext_columns 'books' |
说明:此次查询的结果显示存在一个错误,并且 writer_name 列而非 title 列包含在全文索引的定义中。
13.停用 books 表以便将 title 列添加到全文索引,同时将 writer_name 列删除,方法是执行下列存储过程:
sp_fulltext_table 'books', 'deactivate' |
除了允许添加和删除列外还停用 books 表,这意味着该表不再参与 PubsCatalog 全文目录的填充。但将保留元数据,并且可重新激活该表。books 表的现有全文索引将一直保留到下一次对 PubsCatalog 全文目录进行完全填充,但在此期间并不使用,因为 Microsoft® SQL Server™ 2000 禁止对已停用的表进行查询。
14.在 books 表的全文索引的元数据中添加 title 列和删除 writer_name 列。对每个列执行一次下列存储过程:
sp_fulltext_column 'books', 'writer_name', 'drop' sp_fulltext_column 'books', 'title', 'add' |
15.使用下列存储过程重新激活 books 表:
sp_fulltext_table 'books', 'activate' |
如果重新激活表但没有重新填充索引,则旧索引仍可用于对其余的全文启用列执行的查询,但不能用于对任何新的全文启用列执行的查询。在重写前,可以通过键入星号 (*) 作为列名在特定的查询上对来自已删除列的数据进行匹配,这些查询指定对所有全文列的检索。
执行下列存储过程以启动对 PubsCatalog 全文目录的增量填充:
sp_fulltext_catalog 'PubsCatalog', 'start_incremental' |
增量填充可以刷新全文目录,其方式为对具有下列特征的启用全文的列中的数据进行索引:
◆从上次填充以来曾被更新或插入的行。
◆有 timestamp 列的表。
◆从上次填充以来已为全文处理而启用的所有行,或其架构从上次填充以来曾被修改过(无论以何种方式)的列。
17.对 PubsCatalog 全文目录的重写完成后,从步骤 10 开始重新发出 Transact-SQL 查询。这一次应该不会发生错误。