解析:怎样使其他用户能够发出全文查询

来源:岁月联盟 编辑:zhuzhu 时间:2007-10-24

本示例说明怎样使用 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 查询。这一次应该不会发生错误。