您的免费搜索引擎 – Microsoft Indexing Server






4.69/5 (34投票s)
2005 年 5 月 15 日
18分钟阅读

226880

3692
Microsoft Indexing Server 是一个强大的索引和搜索引擎,可用于您的 Web 或文件搜索。本文将介绍如何设置 Indexing Server 以及如何在应用程序内搜索其索引。
引言
许多 Web 应用程序都提供搜索功能,允许用户搜索 Web 应用程序中的所有内容。乍一看,这似乎是一项艰巨的任务。您如何搜索 Web 应用程序中的所有文件,同时又能提供大多数用户已习以为常的强大搜索功能?例如,搜索具有 and 或 or 组合的任何单词组合,搜索短语或搜索部分单词匹配。构建这样的搜索引擎并非易事。市面上有很多自定义解决方案,它们创建了自己的搜索算法。它们要么价格低廉但只能提供有限的搜索功能,要么价格昂贵。
但是,没有必要自己构建解决方案或购买昂贵的解决方案。Microsoft 提供了此问题的解决方案——Microsoft Indexing Server。Microsoft Indexing Server 作为 Windows 2000、Windows XP 和 Windows 2003 的一部分提供,无需任何额外许可。本文将介绍 Indexing Server 的功能。它还将通过代码介绍如何使用 Indexing Server 在应用程序中提供搜索功能。重要的是要理解 Indexing Server 会索引文件系统中的文件。它不是一个可以浏览您的网站并查找所有链接页面并对其进行索引的网络爬虫。Google、MSN、Yahoo 等搜索引擎使用的就是网络爬虫来索引网页。但是,Indexing Server 能够指向本地网站,获取这些网站文件所在的物理路径,然后索引这些文件,并存储这些文件的虚拟路径。这样,您仍然可以索引本地 Web 应用程序的文件,并知道每个文件的 URL。
如何安装 Microsoft Indexing Server?
Windows 2000 附带 MS Indexing Server 2.0,而 Windows XP 和 Windows 2003 附带 MS Indexing Server 3.0。本文将重点介绍 MS Indexing Server 3.0,尽管几乎所有内容都适用于前一个版本。MS Indexing Server 是一个需要安装的独立 Windows 组件。转到控制面板中的“添加或删除程序”,然后选择“添加/删除 Windows 组件”。确保已安装“索引服务”组件。在安装 IIS 后安装此组件很重要。IIS 具有索引服务扩展,只有在 IIS 安装之后再安装索引服务时,此扩展才会安装。如果此组件未显示,请卸载“索引服务”组件,然后重新安装。之后,您还会在 IIS 中看到“索引服务”扩展。有关此问题的更多信息,请参阅此处。
如何启动索引服务?
您可以通过“计算机管理”来配置 Indexing Server。在左侧窗格的“服务和应用程序”条目下,您会找到一个名为“索引服务”的条目。右键单击“索引服务”,然后从弹出菜单中选择“启动”。首次执行此操作时,它会询问您是否要在计算机启动时启动该服务。选择“是”,这将把“索引服务”设置为自动启动。通过此,您可以停止、暂停和恢复索引服务。当您展开“索引服务”条目(通过加号)时,您会看到目录列表。目录是对搜索进行索引的文件夹组。Indexing Server 随附两个目录,但您可以根据需要创建自定义目录。
系统目录的用途是什么?
系统目录用于 Windows 文件搜索功能。当您从 Windows 开始菜单中选择“搜索”或打开文件资源管理器并单击“搜索”按钮时,会打开 Windows 文件搜索。如果 Indexing Server 未运行或没有系统目录,则会搜索实际的文件系统。但是,如果系统目录可用且索引服务正在运行,它将利用系统目录。您还可以配置搜索功能以利用系统目录。在搜索窗格(文件资源管理器中)的底部,选择“更改选项”。选择“使用索引服务”选项,然后选择“是,启用索引服务”选项。您可以以同样的方式关闭“索引服务”的使用。利用索引服务可以加快搜索速度,因为所有文件都已索引,系统只需搜索索引而不是文件系统本身。
展开“系统”目录(通过加号)以了解更多详细信息。选择“目录”条目以查看此目录中包含或排除的所有文件夹。默认情况下,这包括 c:\ 和 c:\Documents and Settings 文件夹,但会排除 c:\Documents and Settings\*\Application Data\* 和 c:\Documents and Settings\*\Local Settings\* 文件夹。这意味着它将排除任何用户配置文件下的“应用程序数据”文件夹(及其所有子文件夹)以及“本地设置”文件夹(及其所有子文件夹)。您可以双击每个文件夹并更改为包含或排除。您还可以通过右键单击左侧窗格中的“目录”条目,然后从弹出菜单中选择“新建 | 目录”来添加新文件夹。您可以输入本地文件夹或任何网络文件夹的 UNC 路径。对于网络文件夹,您还需要输入用户名和密码。
Web 目录的用途是什么?
Web 目录仅在安装了 IIS 后才可用。默认情况下,它指向本地 IIS 实例的“默认 Web 站点”。右键单击左侧窗格中的“Web”条目,然后从弹出菜单中选择“属性”。选择“跟踪”选项卡以查看此目录指向哪个网站。默认情况下,这是“默认 Web 站点”。您可以选择本地 IIS 实例的任何现有网站。索引服务将查找此网站的物理路径,并将其添加到要索引的目录中。它还会查找此网站下的所有虚拟文件夹,并再次将其物理路径添加到此目录。
“索引服务”扩展将 IIS 直接集成到 Indexing Server 中。在 IIS 管理器中,打开网站或此网站下配置的任何虚拟文件夹的属性对话框。在“主目录”或“虚拟目录”选项卡下,您可以看到“索引此资源”选项。取消选择此选项并保存设置将从 Indexing Server 的相应目录中删除此物理路径(这需要目录已启动,并且可能需要一段时间才能进行更改)。选择此选项将自动将物理文件夹重新添加到相应目录。这样,您就可以直接从 IIS 管理器控制哪些文件夹将被索引,哪些不会。您还可以为 IIS 管理器中显示的每个文件系统文件夹提供“索引此资源”选项。但我尚未看到此选项对 IIS 管理器中显示的文件文件夹有任何影响。
要在 Windows XP 和 Windows 2003 随附的 IIS 6 上实现此功能,您需要确保“索引服务”扩展正在运行。打开 IIS 管理器,然后在左侧窗格中打开“Web 服务扩展”项。右侧会显示所有扩展,默认情况下,“索引服务”是受禁止的。选择它,然后通过“允许”按钮启用它。另外,请确保正如前面解释的那样,在安装索引服务之前已安装 IIS。
还有哪些其他管理选项可用?
您可以通过右键单击左侧窗格中的“索引服务”条目,然后从弹出菜单中选择“新建 | 目录”来创建新目录。输入目录的名称以及存储目录文件的文件夹。然后,您需要停止并重新启动索引服务本身,以便创建此新目录的目录文件。您还可以通过目录名称下的“目录”条目添加或删除要包含的文件夹。如果您想索引一个网站,请打开目录的属性(右键单击目录名称并选择“属性”),然后在“跟踪”选项卡下选择要索引的网站。
索引服务还可以为索引文件创建摘要。选择属性对话框的“生成”选项卡,然后取消选中“继承服务以上设置”选项。然后选择“生成摘要”选项,并输入摘要的最大长度。您还可以通过索引服务本身的属性来设置此项,然后将其应用于继承索引服务设置的任何目录。
Windows 还允许管理员控制哪些文件夹或文件可以被 Indexing Server 索引。这允许保护敏感文件,使其永远不会包含在索引中,因此永远不会出现在搜索结果中。一个很好的例子是公司的任何财务明细。打开文件资源管理器并导航到适当的文件夹或文件。调出文件夹或文件的属性,单击“高级”按钮,然后取消选中或选中“为快速搜索,允许索引服务索引此文件”选项,然后保存设置。如果您选择了一个文件夹,它会询问您是否应将此设置应用于所有子文件夹,还是仅应用于所选文件夹。例如,实际的目录文件都取消了该设置,因此 Indexing Server 永远不会尝试索引其自身的目录文件。
您还可以通过计算机管理控制台查询目录。展开目录(通过加号),您会看到一个名为“查询目录”的条目。这会打开一个带有简单查询表单的网页。您可以执行简单或高级搜索。选择“标准查询(自由文本)”选项,输入搜索词,然后单击“搜索”按钮。这将执行简单搜索并在搜索表单下方显示任何匹配项。选择“高级查询”,然后输入复杂的搜索词,其中可以包含 AND
和 OR
等运算符。我们将在本文后面讨论 Indexing Server 使用的实际查询语言。这是管理员测试实际目录的一种便捷方式。
Indexing Server 非常易于使用且功能强大。用于生产环境的主要烦恼是您需要在创建新目录后重新启动索引服务,以及在删除目录之前停止索引服务。当然,这不是日常任务,但当与许多目录一起使用时——可能是在托管环境中为许多客户使用——这有点令人烦恼。
如何在代码中查询 Indexing Server 目录?
您可以通过标准的 OLEDB 数据提供程序查询 Indexing Server 目录。连接字符串告诉 OLEDB 数据提供程序使用哪个提供程序,在本例中是 MSIDXS(Microsoft Indexing Server)提供程序。您可以查询本地 Indexing Server 目录或远程 Indexing Server 上的目录。查询本地 Indexing Server 目录时,您还会在连接字符串中指定数据源。将本地目录的名称用作数据源,例如
string ConnectionString = "Provider=MSIDXS; Data Source=\"Web\";";
const string QueryString = "SELECT * FROM WEBINFO;";
查询远程 Indexing Server 上的目录时,您不指定数据源。因此,您只需指定提供程序。然后,在查询本身中指定远程 Indexing Server 的名称和目录。这是一个示例
const string ConnectionString = "Provider=MSIDXS;";
const string QueryString = "SELECT * FROM EnterpriseMinds.Web..WEBINFO;";
以下各节将更详细地介绍查询语言。但是,您可以看到 FROM
子句已更改。首先,您指定远程计算机的名称,后跟一个点,然后是您要在该远程计算机上查询的 Indexing Server 目录,后跟两个点,最后是您要查询的实际视图。以下代码片段显示了如何连接到 OLEDB 数据源、执行查询并返回结果集的 DataReader
。
public static IDataReader Query(string ConnectionString, string QueryString)
{
// get a OLEDB connection object and set the connection string
OleDbConnection Connection = new OleDbConnection();
Connection.ConnectionString = ConnectionString;
// set the query string to execute
IDbCommand Command = Connection.CreateCommand();
Command.CommandText = QueryString;
Command.CommandType = CommandType.Text;
// open the data connection
Connection.Open();
// execute the query and return the data reader; when it gets closed it
// also closes the connection object
return Command.ExecuteReader();
}
调用者需要提供连接字符串和查询字符串。首先,我们创建一个 OLEDB 连接对象并为其设置连接字符串。接下来,我们创建一个 OLEDB 命令对象并设置查询字符串。最后,我们打开 OLEDB 连接,执行命令,并返回一个 OLEDB DataReader
。当调用者关闭 OLEDB DataReader
时,它也会关闭底层的 OLEDB 连接。在下一个代码片段中,我们利用上述方法提供一个简化的 LocalQuery
方法。调用者传递目录名称和查询字符串,无需了解连接字符串的详细信息。
// - the OLEDB data provider to use for searching
// - the Indexing Server is MSIDXS;
// - when we connect to a specific indexing catalog
// - then you specify the data
// source part of the connection string and set it
// to the indexing catalog name
const string ProviderConnectionString = "Provider=MSIDXS;";
const string DataSourceConnectionString = " Data Source=\"{0}\";";
public static IDataReader LocalQuery(string CatalogName,
string QueryString)
{
string ConnectionString = ProviderConnectionString +
String.Format(DataSourceConnectionString, CatalogName);
// perform the query and return result
return Query(ConnectionString, QueryString);
}
该方法组合了连接字符串(其中还包括目录名称作为数据源),然后调用 Query
方法,并将连接字符串和查询字符串传递给它。下一个代码片段再次使用上述 Query
方法创建 RemoteQuery
方法。它允许查询任何可用远程计算机上的任何目录。它再次隐藏了连接字符串的详细信息以及如何修改查询字符串本身。
// - the OLEDB data provider to use for
// - searching the Indexing Server is MSIDXS;
const string ProviderConnectionString = "Provider=MSIDXS;";
// form clause and dot-notation character
const string FromClause = " FROM ";
const string DotNotation = ".";
public static IDataReader RemoteQuery(string RemoteMachineName,
string CatalogName, string QueryString)
{
// replace the FORM clause with a FROM
// remote_machine.catalog_name..from_clause,
// for example FROM SCOPE() against the remote
// machine enterpriseminds and the
// catalog WEB becomes FROM enterpriseminds.web..SCOPE();
// this allows to query
// remote indexing catalogs
QueryString = QueryString.Replace(FromClause,
FromClause + RemoteMachineName +
DotNotation + CatalogName +
DotNotation + DotNotation);
// perform the query and return result
return Query(ProviderConnectionString, QueryString);
}
该方法在查询字符串中搜索 FROM
子句,然后将其替换为 FROM
,后跟远程计算机名称、一个点、目录名称和两个点。它使用不带数据提供程序的连接字符串。最后,它再次调用 Query
方法,并将连接字符串和修改后的查询传递给它,以便查询远程 Indexing Server 目录。如您所见,使用 OLEDB 数据提供程序查询本地和远程目录非常容易。
OLEDB Indexing Server 提供程序使用哪种查询语言?
MSIDXS 提供程序支持 SQL 查询语言,该语言广为人知,可以轻松查询 Indexing Server。它仅支持查询,不支持任何更新、插入或删除。支持的查询语法对此提供程序略有调整。您可以在此处找到详细文档。最大的区别在于 FROM
子句。您可以指定一个现有视图或 SCOPE()
函数。Indexing Server 随附以下预定义视图。引用的 MSDN 帮助页面列出了哪些字段包含在哪个视图中。例如,我们在上面的查询字符串中使用了 WEBINFO
视图。您可以使用 SELECT * FROM view
,而在使用 SCOPE()
函数时不允许这样做。您也可以使用 CREATE VIEW
命令创建自己的视图。这是用于定义 WEBINFO
视图的 CREATE VIEW
命令。
CREATE VIEW WEBINFO AS
SELECT Vpath, path, FileName, size, write, attrib,
Characterization, DocTitle FROM SCOPE()
您可以使用 SCOPE()
函数代替视图,该函数定义 SELECT
的范围。SCOPE()
函数支持以下参数。
DEEP TRAVERSAL OF
这将搜索指定的路径及其下方所有文件夹。例如,
DEEP TRAVERSAL OF
"/" 将搜索根文件夹及其下方所有文件和文件夹。这实际上是仅指定SCOPE()
时使用的默认范围,这意味着网站中的所有内容都包含在搜索中。SHALLOW TRAVERSAL OF
这将仅搜索指定的路径,意味着排除可能存在的任何子文件夹。例如,
SHALLOW TRAVERSAL OF
"/" 只搜索网站的根文件夹,但不搜索任何子文件夹。
对于 DEEP TRAVERSAL OF
和 SHALLOW TRAVERSAL OF
,您可以列出任意数量的路径。您也可以多次包含每个命令。以下是一些示例:
FROM SCOPE(' SHALLOW TRAVERSAL OF ("/", "/Help") ')
这仅包含根目录和 Help 文件夹。不包括任何子文件夹。
FROM SCOPE(' "/Info", "/Help" ')
参数
DEEP_TRAVERSAL OF
是默认参数。此示例包含 Info 和 Help 文件夹及其所有子文件夹。FROM SCOPE(' "/Info" ', ' SHALLOW TRAVERSAL OF "/Help" ')
此示例对 Info 文件夹执行
DEEP TRAVERSAL
,这意味着它包含所有子文件夹,并包含 Help 文件夹但不包含其子文件夹。
WHERE
子句支持与标准 SQL 语言相同的过滤。有关完整说明,请参阅本文。LIKE
运算符可用于使用通配符执行模式匹配。MATCHES
运算符可用于使用正则表达式执行模式匹配。FREETEXT
运算符执行单词和短语的最佳匹配。CONTAINS
运算符执行文本匹配,包括邻近搜索和词干提取。以下是一些示例:
WHERE FileName LIKE '%web%'
返回文件名中包含单词 web 的所有项。
WHERE FileName LIKE '%config'
返回文件名以单词 config 结尾的所有项。
WHERE CONTAINS(FileName, ' "web" OR "default" ')
返回文件名中包含单词 web 或 default 的所有项。
WHERE FREETEXT(FileName, ' default web ')
再次返回文件名中包含单词 web 或 default 的所有项。
WHERE MATCHES(Contents, ' |(product|)|{2,3|} ')
返回内容中包含单词 product 两到三次的所有项。
这使我们能够构建一些非常复杂的查询,利用标准的 SQL 语言。构建支持所有这些功能的搜索引擎将是一项艰巨的任务。 以下文章列出了您可以在 SELECT
语句中使用的所有字段,并对其进行了说明。
Indexing Server 能够索引哪些文件?
到目前为止,我们已经介绍了如何设置 Indexing Server 来索引文件、文件夹和网站。我们还介绍了如何连接到 Indexing Server 目录并使用 OLEDB 数据提供程序和 SQL 查询语言以编程方式搜索它们。我们尚未介绍的是 Indexing Server 为您搜索的内容类型以及如何扩展它。Indexing Server 使用所谓的过滤器提取文件内容。过滤器是实现 IFilter
接口的组件,它们能够读取文件内容。HTML
文件的内容与 RTF 文件、Microsoft Office 文件或纯文本文件的内容不同。因此,对于这些不同的文件类型,有不同的过滤器可用。“MSN Desktop Search”利用相同的过滤器插件。 以下文章列出了哪些过滤器能够读取哪些文件类型。它还列出了许多其他可用的过滤器以及可以从何处下载它们。请记住,本文讨论的是 MSN Desktop Search,但所有这些过滤器也适用于 Indexing Server。
Indexing Server 的所有注册表设置都可以在 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\ContentIndex 中找到。例如,您会看到一个名为 Catalogs 的子项,其中列出了此 Indexing Server 上定义的所有目录。对于每个目录,您还可以找到所有设置。在 ContentIndex
键下,您会找到一些索引服务的设置,其中一个称为 DLLsToRegister
。它列出了 Indexing Server 在启动时将注册的所有 DLL。这还包括 Indexing Server 使用的所有过滤器。将此与列出所有可用过滤器的文章进行比较,您可以看到开箱即用的过滤器如下:
- query.dll
过滤具有 TXT、ASM、BAT、C、CPP、CXX、CMD、DEF、DIC、H、HPP 和 XML 扩展名的文件。这些都作为纯文本文件读取。
- nlhtml.dll
过滤具有 ASCX、ASP、ASPX、CSS、HHC、HTA、HTM、HTML、HHT、HTW、HTX、ODC 和 STM 扩展名的文件。这些都是包含或呈现 HTML 内容的文件。
- offfile.dll
过滤具有 DOC、DOT、POT、PPS、PPT、XLB、XLC、XLS 和 XLT 扩展名的文件。所有这些文件都是 MS Office 文件。
- mimefilt.dll
过滤具有 EML 扩展名的文件,这些是 MIME 内容。
- mspfilt.dll
过滤具有 TIFF 扩展名的文件。此过滤器由 MS Office 2003 安装。
您可以在此处找到所有 Indexing Server 注册表项的完整说明。如果您有兴趣为自定义文件类型编写自己的过滤器,请访问此链接。它提供了您需要实现的 IFilter
接口的完整说明。
摘要
Microsoft Indexing Server 是一个强大的索引和搜索引擎,可用于您的 Web 或文件搜索。OLEDB 数据提供程序结合 SQL 查询语言,可以轻松查询 Indexing Server 创建的索引。您可以轻松地提供简单的文本搜索以及带有部分单词、单词和短语匹配的强大搜索。这包括词干提取以及区分语言的搜索。这意味着您无需付出额外的努力,无论您索引和搜索的是英语内容还是亚洲内容。过滤器框架提供了扩展 Indexing Server 以搜索您可能拥有的任何自定义内容的能力。您还可以将相同的过滤器用于 MSN Desktop Search 引擎,这一点非常好。
随附的示例应用程序允许您搜索任何本地或远程 Indexing Server 目录。您可以输入要执行的 SQL 查询字符串,或从一组默认查询字符串中选择。结果集显示在列表视图中。它还显示返回的匹配项数量。如果您对本文或此主题有任何评论,请通过 klaus_salchner@hotmail.com 与我联系。我很想知道您是否学到了新东西。如果您对此主题或文章有任何疑问,请与我联系。