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

Microsoft Indexing Service 操作指南

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.56/5 (11投票s)

2007年7月10日

CPOL

15分钟阅读

viewsIcon

195166

downloadIcon

1387

本文介绍了如何在.NET应用程序中使用Microsoft索引服务提供全文搜索功能。

引言

许多网站提供搜索功能,您可以输入几个单词,然后按“搜索”按钮,就会得到包含这些单词的页面列表。这很简单。但如何在自己的Web应用程序中实现这些功能呢?是的,您需要使用一个索引服务来索引您的文件或网页。之后,您就可以使用全文搜索功能了。

有许多解决方案可以帮助您在应用程序中提供此功能。其中之一就是Microsoft索引服务。它是Windows 2000及更高版本Windows的一部分。因此,如果您只提供Windows解决方案(ASP.NET Web应用程序、Windows窗体应用程序等),您就必须了解一下Microsoft的这款产品。

索引服务最大的优点之一是它是完全免费的。您可以不受任何限制或额外许可地使用它。我认为这一点非常重要,因为其他索引产品价格昂贵。如果您正在开发中小型应用程序,您肯定不希望为全文搜索工具支付数千美元。

如果您选择使用索引服务,您应该记住它只能索引文件系统。例如,您不能用它来索引存储在数据库中的文件。这是Microsoft索引服务的一个大缺点,但我相信您可以轻松解决这个限制。

在本文中,我将尝试介绍如何安装、配置和使用Microsoft索引服务。我们将开发一个简单的应用程序,该应用程序将允许我们使用对本地文件系统上的网页的全文搜索功能。

安装和配置Microsoft索引服务

如果您使用的是Windows XP或更高版本,您将使用Microsoft索引服务3.0。如果您仍在使用Windows 2000,您将使用Microsoft索引服务2.0。此服务默认情况下安装在您的计算机上。但是,您可能在安装操作系统时禁用了它的安装。您必须指定要在计算机上安装索引服务。要做到这一点,请在控制面板中选择“添加或删除程序”。在那里选择“添加/删除Windows组件”。您必须勾选“索引服务”已安装。如果未安装,请进行安装。

Microsoft Indexing Service Installation

现在,Microsoft索引服务已经安装完毕,您可以进行配置了。打开“计算机管理”配置工具。选择“服务和应用程序”,然后选择“索引服务”。在此条目下,您可以管理您的Microsoft索引服务。

首先,您应该为将包含索引的文件夹在索引服务中创建一个新的目录。右键单击“索引服务”,然后在“新建”子菜单中选择“目录”。输入“名称”,选择“位置”,然后按“确定”。

New Catalog Creation

之后,您必须添加将被索引的文件夹。为此,请选择“目录”条目,打开其上下文菜单,然后在“新建”子菜单中选择“目录”。在打开的对话框中选择包含您的文档的文件夹,然后按“确定”以将选定的目录包含到索引中。如果您决定从现有索引中排除文件夹,请在该对话框窗口中为“包含在索引中?”参数选择“否”。此参数默认值为“是”。

New Directory Creation

如果您的索引服务正在运行,它将索引新的目录。否则,您应该启动索引服务,它将自动索引该目录。您可以手动创建或重新创建索引文件夹。要做到这一点,您应该右键单击现有目录中指定的文件夹,然后在“所有任务”子菜单中选择“重新扫描(全部)”或“重新扫描(增量)”。当然,此时您的Microsoft索引服务必须正在运行。

如果您在“计算机管理”中选择“索引服务”条目,您将看到索引服务的状态。有时,这些信息可以帮助您,如果您有大量存储并且找不到文件。

索引服务还有另一个重要的设置——“索引服务使用情况”。此设置允许您告诉索引服务多久更新一次索引。例如,如果您的应用程序仅使用静态存储,服务就不需要如此频繁地更新索引,因为如果您使用动态数据存储,您的数据会频繁更新。要配置此参数,您应该右键单击“索引服务”条目,然后在“所有任务”子菜单中选择“性能调整”。

Indexing Service Usage Configuration

现在,您可以检查索引。为此,请选择目录中的“查询目录”。您会看到一个表单,允许您在索引中搜索内容。首先,您可以测试一个简单的全文搜索。在查询字段中输入内容,然后按“搜索”按钮。现在,您将能够看到包含输入单词的文件。当然,您可以使用此工具执行更复杂的查询。如果您想执行一些复杂查询,请选择“高级查询”。您可以使用Microsoft索引服务的查询来获取所需信息。此查询语言与SQL相同,但包含一些语法扩展。

查询Microsoft索引服务

您可以使用SQL查询Microsoft索引服务。但是,索引服务的SQL方言有一些扩展,您需要了解。

在使用Microsoft索引服务时,最有用的命令是SELECT命令。这是很清楚的,因为您不应该添加、删除或更新索引中的信息。您使用Select来查询索引服务,以检索有关被索引文件的信息。让我们看一个查询示例

SELECT Path FROM SCOPE() WHERE FREETEXT(Contents, 'Hello World')

此查询返回所有包含“Hello World”文本的文件的路径。它可以帮助我向您介绍Microsoft索引服务的SQL扩展。

首先,让我们看一下FROM表达式。在此示例中,我们查询索引包含的所有数据。SCOPE()函数允许您告诉索引服务您决定检查哪些数据。默认情况下,如果您不使用任何参数,它会检查您索引中的所有数据。此函数可以优化您的查询,因为它可以限制搜索的索引。例如,您可以使用SCOPE ('"/books"')。在这里,您将只查询“/books”文件夹,而不是索引中的所有文件夹。查询执行速度将比使用简单的SCOPE()函数更快。为了进一步限制搜索,您可以使用特殊的遍历类型。例如,SCOPE ('DEEP TRAVERSAL OF "/books"')。如果您使用此表达式,索引服务将在“/books”目录及其所有子目录中进行搜索。如果您使用SHALLOW TRAVERSAL,Microsoft索引服务将只检查“/books”目录。例如,SCOPE('SHALLOW TRAVERSAL OF "/books"')

WHERE表达式与SQL中的相同,但也有一些扩展。有比较谓词。您可以在此表中看到它们

运算符 符号 示例
Equals = WHERE DocAuthor = 'John Doe'
不等于 != 或 <> WHERE DocTitle != 'Finance'
小于 < WHERE WordCount < 1000
大于 > WHERE WordCount > 500
小于或等于 <= WHERE WordCount <= 500
大于或等于 >= WHERE WordCount >= 500

您还可以使用布尔运算符,这些运算符将按照以下规则进行评估

  • NOTAND 之前进行评估。NOT 只能出现在 AND 之后(例如 AND NOTOR NOT 的组合是不允许的)。
  • ANDOR 之前进行评估。
  • AND 表达式是关联的,并且可以按任何顺序应用。例如,A AND B AND C(A AND B) AND C 相同,也与 A AND (B AND C) 相同。
  • OR 表达式是关联的,并且可以按任何顺序应用。

还有一个LIKE谓词。但是,有几个谓词扩展了SQL语言

  • ARRAY。此谓词使用逻辑运算符对两个数组进行比较。例如,... WHERE username = SOME ARRAY ['Admin' , 'root']。此示例返回包含'Admin'或'root'的username参数的文件。
  • CONTAINS。此谓词用于全文搜索。例如,…WHERE CONTAINS(country,'"USA" OR "Russia"')。此示例返回包含country属性为"USA"或"Russia"的文件。
  • FREETEXT。此谓词允许您在索引文件中查找单词和短语。如果您需要在文件内容中查找任何内容,最好使用它。例如,…WHERE FREETEXT(Contents,'Hello World !!!')
  • MATCHES。此谓词使用正则表达式模式执行查询。它比LIKE谓词功能更强大。例如,… WHERE MATCHES (Contents, '|(USA|)|{1|}' )。此示例匹配任何字符串,其中恰好有一个模式“BUSA”的实例。

有关其他信息,请参阅MSDN网站上的索引服务文章

现在您知道如何准备Microsoft索引服务的查询了,但您仍然需要获取一份可以在查询中使用的属性列表。每个索引都有许多默认属性,您可以在下表中找到。

友好名称 数据类型 属性
A_HRef DBTYPE_WSTR | DBTYPE_BYREF HTML HREF的文本。此属性名称是为Microsoft® Site Server创建的,对应于索引服务的属性名称HtmlHRef。可以查询,但不能检索。
访问 VT_FILETIME 上次访问文件的时间。
全部 (不适用) 搜索字符串的每个属性。可以查询,但不能检索。
AllocSize DBTYPE_I8 文件的磁盘分配大小。
Attrib DBTYPE_UI4 文件属性。在Win32 SDK中有记录。
ClassId DBTYPE_GUID 对象的类ID,例如WordPerfect、Word等。
Characterization DBTYPE_WSTR | DBTYPE_BYREF 文档的摘要或特征。由索引服务计算。
目录 (不适用) 文件的主要内容。可以查询,但不能检索。
Create VT_FILETIME 文件创建时间。
Directory(目录) DBTYPE_WSTR | DBTYPE_BYREF 文件的物理路径,不包括文件名。
DocAppName DBTYPE_WSTR | DBTYPE_BYREF 创建文件的应用程序的名称。
DocAuthor DBTYPE_WSTR | DBTYPE_BYREF 文档的作者。
DocByteCount DBTYPE_14 文档中的字节数。
DocCategory DBTYPE_STR | DBTYPE_BYREF 文档的类型,如备忘录、计划或白皮书。
DocCharCount DBTYPE_I4 文档中的字符数。
DocComments DBTYPE_WSTR | DBTYPE_BYREF 文档的注释。
DocCompany DBTYPE_STR | DBTYPE_BYREF 编写文档的公司名称。
DocCreatedTm VT_FILETIME 文档创建时间。
DocEditTime VT_FILETIME 编辑文档所花费的总时间。
DocHiddenCount DBTYPE_14 Microsoft® PowerPoint文档中的隐藏幻灯片数量。
DocKeywords DBTYPE_WSTR | DBTYPE_BYREF 文档关键字。
DocLastAuthor DBTYPE_WSTR | DBTYPE_BYREF 最近编辑文档的用户。
DocLastPrinted VT_FILETIME 文档上次打印时间。
DocLastSavedTm VT_FILETIME 文档最后保存时间。
DocLineCount DBTYPE_14 文档中的行数。
DocManager DBTYPE_STR | DBTYPE_BYREF 文档作者的经理姓名。
DocNoteCount DBTYPE_14 PowerPoint文档中带有注释的页数。
DocPageCount DBTYPE_I4 文档中的页数。
DocParaCount DBTYPE_14 文档中的段落数。
DocPartTitles DBTYPE_STR | DBTYPE_VECTOR 文档部分的名称。例如,在Excel中,部分标题是电子表格的名称;在PowerPoint中,是幻灯片的标题;在Word for Windows中,是主文档中文档的名称。
DocPresentationTarget DBTYPE_STR | DBTYPE_BYREF PowerPoint演示文稿的目标格式(35毫米、打印机、视频等)。
DocRevNumber DBTYPE_WSTR | DBTYPE_BYREF 文档的当前版本号。
DocSlideCount DBTYPE_14 PowerPoint文档中的幻灯片数量。
DocSubject DBTYPE_WSTR | DBTYPE_BYREF 文档的主题。
DocTemplate DBTYPE_WSTR | DBTYPE_BYREF 文档的模板名称。
DocTitle DBTYPE_WSTR | DBTYPE_BYREF 文档的标题。
DocWordCount DBTYPE_I4 文档中的单词数。
FileIndex DBTYPE_I8 文件的唯一ID。
FileName DBTYPE_WSTR | DBTYPE_BYREF 文件名。
HitCount DBTYPE_I4 文件中匹配查询的单词数。
HtmlHRef DBTYPE_WSTR | DBTYPE_BYREF HTML HREF的文本。可以查询,但不能检索。
HtmlHeading1 DBTYPE_WSTR | DBTYPE_BYREF H1样式的HTML文档文本。可以查询,但不能检索。
HtmlHeading2 DBTYPE_WSTR | DBTYPE_BYREF H2样式的HTML文档文本。可以查询,但不能检索。
HtmlHeading3 DBTYPE_WSTR | DBTYPE_BYREF H3样式的HTML文档文本。可以查询,但不能检索。
HtmlHeading4 DBTYPE_WSTR | DBTYPE_BYREF H4样式的HTML文档文本。可以查询,但不能检索。
HtmlHeading5 DBTYPE_WSTR | DBTYPE_BYREF H5样式的HTML文档文本。可以查询,但不能检索。
HtmlHeading6 DBTYPE_WSTR | DBTYPE_BYREF H6样式的HTML文档文本。可以查询,但不能检索。
Img_Alt DBTYPE_WSTR | DBTYPE_BYREF <IMG>标签的替代文本。可以查询,但不能检索。
Path DBTYPE_WSTR | DBTYPE_BYREF 文件的完整物理路径,包括文件名。
DBTYPE_I4 行的排名。范围从0到1000。数字越大表示匹配越好。
RankVector DBTYPE_I4 | DBTYPE_VECTOR 向量查询各个组件的排名。
ShortFileName DBTYPE_WSTR | DBTYPE_BYREF 短(8.3)文件名。
大小 DBTYPE_I8 文件大小(字节)。
USN DBTYPE_I8 更新序列号。仅NTFS驱动器。
VPath DBTYPE_WSTR | DBTYPE_BYREF 文件的完整虚拟路径,包括文件名。如果存在多个可能路径,则选择最适合特定查询的路径。
WorkId DBTYPE_I4 文件的内部ID。在索引服务中使用。
Write VT_FILETIME 文件最后写入时间。

如您所见,每个文件都有很多被索引的属性,但有时您想扩展此列表。

如何为被索引文件添加新属性

首先,此功能仅适用于网页,因为它基于HTML<meta>标签。

假设您有几个被索引的网页,并且想为它们添加一些特殊属性。例如,如果您想添加“country”和“city”属性,您应该在将包含这些新属性的所有文件中添加<meta>标签

<meta name="country" content="Russia" />
<meta name="city" content="Moscow" />

更改后,您必须重新启动索引服务。现在,您可以打开“属性”条目,并看到Microsoft索引服务已经了解了文件的特殊参数。但是,您仍然不能在查询中使用这些新参数。

选择目录的“属性”节点,然后选择您通过<meta>标签添加到文件中的属性。双击该属性,选中“缓存”复选框,然后从打开的对话框中选择新属性的数据类型。

Microsoft Indexing Service Installation

之后,您应该创建一个列定义文件,其中包含有关新添加参数的信息。该文件可以具有“.idq”扩展名,但这并不重要。列定义文件使用以下格式

[Names]
Propertyname( Data type ) = GUID ["Name" | Property ID]

数据类型参数是可选的。如果未定义,Microsoft索引服务将从目录的参数定义中获取数据类型。

对于我的示例,它包含以下内容

[Names]
country = d1b5d3f0-c0b3-11cf-9a92-00a0c908dbf1 "country"
city = d1b5d3f0-c0b3-11cf-9a92-00a0c908dbf1 "city"

所有这些数据都可以从属性配置对话框中获取。

创建列定义文件后,有关此文件的信息必须添加到索引服务的注册表设置中。在注册表键“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ContentIndexCommon”下添加一个名为“DefaultColumnFile”的字符串条目。“DefaultColumnFile”应包含您的列定义文件的完整路径。

重新启动Microsoft索引服务。之后,对您的索引文件夹运行一次完全重新扫描。现在,您将能够在查询中使用新参数。

在WinForms应用程序中使用Microsoft索引服务

Microsoft索引服务作为OLE DB提供程序暴露给开发人员。它的名称是MSIDXS。您可以使用ADO.NET来查询您的索引服务。要做到这一点,您必须创建一个新的System.Data.OleDb.OleDbConnection对象,并使用此示例连接字符串

Provider= "MSIDXS";Data Source="Documents"

Data Source参数中,您应该使用索引服务中目录的名称。

让我们创建一个示例代码,该代码将从文件内容中查询几个单词的索引服务。在此示例中,有一个queryString变量。它是SearchParameters结构的实例。此结构包含有关数据源和查询字符串的信息。这是该结构的定义

struct SearchParameters
{
    private string storage;

    public string Storage
    {
        get { return storage; }
        set { storage = value; }
    }

    private string query;

    public string Query
    {
        get { return query; }
        set { query = value; }
    }
}

首先,您创建一个新的OleDbConnection对象

string connectionString = 
  string.Format("Provider= \"MSIDXS\";Data Source=\"{0}\";", 
  queryString.Storage);
OleDbConnection connection = new OleDbConnection(connectionString);

之后,您必须创建一个与此连接相关联的新OleDbCommand对象

string query = string.Format(@"SELECT Path FROM scope() " + 
               @"WHERE FREETEXT(Contents, '{0}')", queryString.Query);
OleDbCommand command = new OleDbCommand(query, connection);

请注意,MSIDXS提供程序不支持带参数的命令。这不好。我希望Microsoft能在Microsoft索引服务的下一个版本中修复此问题。

您现在可以执行此命令并检索包含所选文本的文件列表

connection.Open();

ArrayList result = new ArrayList();

OleDbDataReader reader = command.ExecuteReader();
while (reader.Read())
{
    result.Add(reader.GetString(0));
}

connection.Close();

在此代码中,检查返回值是否为NULL不是必需的,因为索引服务始终会返回找到文件的路径。

摘要

Microsoft索引服务是一个完全免费且功能强大的产品,随Windows 2000或更高版本一起提供。它非常易于使用。您可以轻松创建索引。您还可以使用OLEDB数据提供程序查询这些索引。如果您正在使用Microsoft .NET,它真的很容易使用。在本文中,我尝试介绍了如何安装、配置和查询Microsoft索引服务。我还建议您查看我附加到本文的示例。该示例将向您展示如何使用全文搜索功能。我希望本文能帮助您开始有效地使用索引服务。

在准备本文时,我使用了这些材料

© . All rights reserved.