65.9K
CodeProject 正在变化。 阅读更多。
Home

Microsoft Indexing Service和OLEDB

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.76/5 (10投票s)

2008 年 1 月 30 日

CPOL

3分钟阅读

viewsIcon

34654

如何使用 OLEDB 访问 Windows 索引服务。

引言

Microsoft 索引服务和 OLEDB 结合在一起非常强大。 Microsoft 索引服务提供属性筛选和搜索,以及文件数据的全文索引和搜索。

背景

索引服务为几种流行的文件格式提供筛选器,包括 Microsoft Word、Microsoft PowerPoint、Microsoft Excel 和 HTML。 筛选器也可用于纯文本。 客户和第三方供应商也可以为其他格式编写筛选器。

筛选器的一个目的是提供对非纯文本文档的支持。 另一个目的是捕获属性值,这些值既来自文件内容,也来自有关文件的信息。 假设每个文件都是一个文档,那么属性示例包括每个文档的标题、每个 PowerPoint 文档中带注释的页数、每个文档中的段落数、每个文件的上次访问日期和时间以及每个文件的物理路径。

文件系统搜索的全文索引是通过扫描文件内容来创建的。 该过程包括跟踪使用的重要单词以及它们的位置。 例如,全文索引可能表明单词 Canada 在给定文件的第 227 个词、第 473 个词和第 1017 个词处找到。 此索引结构支持对包含索引词的所有项目进行高效搜索,以及诸如短语搜索和邻近搜索之类的高级搜索操作。

使用代码

索引服务将索引和属性值存储在文本搜索目录中。 默认情况下,安装索引服务时会创建一个名为 Web 的文本搜索目录。 给定的文本搜索目录引用一个或多个 IIS 虚拟目录(也称为虚拟根)。 虚拟目录引用一个或多个物理目录,还可以选择引用其他虚拟目录。 将实际文件通过虚拟目录链接到文本目录后,索引服务会收到必须编制索引的新文件通知,并开始筛选和索引与这些文件关联的属性和内容。 索引服务还会收到对这些文件的任何后续更改的通知,并将重新筛选和重新索引更新的文件。

要创建新目录,请运行 *ciadv.msc* 转到索引服务控制台。

  1. 创建目录并指定目录将放置其索引文件的位置。
  2. 将目录添加到目录。 将对这些目录中的文件进行索引。

您会注意到,在选择一个或多个目录后,索引服务将开始索引文件。 现在,您可以使用 T-SQL 或 .NET OLEDB 连接对象在索引服务上执行查询。

要使用 T-SQL 执行查询,您应该首先将链接服务器添加到您创建的索引服务目录。

您可以使用 Enterprise Manager 或 sp_addlinkedserver 存储过程来创建此链接服务器。 提供程序应设置为“Microsoft OLE DB Provider for Indexing Service”或 MSIDXS,数据源应设置为您刚刚创建的目录的名称。

现在,您可以简单地运行如下查询

SELECT * FROM OPENQUERY(linkedserver, 
  ‘SELECT Directory, FileName FROM SCOPE() WHERE FileName LIKE ‘’%.doc’’’)

此查询将选择链接服务器中设置的目录索引的所有文件。

以下查询将使用全文搜索 CONTAINS 短语来搜索特定单词

SELECT * FROM OPENQUERY(linkedserver, ‘SELECT Directory, FileName FROM SCOPE() WHERE 
  FileName LIKE ‘’%.doc’’ AND CONTAINS(‘’ “white” AND “elephant” ’’) ’)

这些查询也可以使用 .NET 中的 OLEDB 连接对象来完成,而无需使用 SQL Server。 只需创建 OleDbConnection 对象的新实例,并将其连接字符串属性设置为

Provider=MSIDXS;DataSource=CatalogName;Locale Identifier=N;

区域设置标识符取决于文件中使用的语言。 我在索引阿拉伯语 Word 文件时遇到了问题,但在设置正确的区域设置标识符后,索引就没有任何问题了。(我使用 1043 作为阿拉伯语的区域设置标识符。)

设置连接字符串后,我们可以创建一个 OleDbCommand 对象,并简单地在命令文本属性中设置以下查询

SELECT Directory, FileName FROM SCOPE() WHERE FileName LIKE ’%.doc’

在这里,我们可以使用 OleDbAdapterDataTableOleDbReader 来读取查询的输出。

© . All rights reserved.