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

为您的网站添加搜索功能

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.84/5 (41投票s)

2000 年 6 月 16 日

CPOL
viewsIcon

1211344

downloadIcon

6435

使用 Microsoft Index Server 为您的读者提供网站搜索功能

Sample Image - IndexServer.gif

引言

一旦网站开始增长,搜索功能就成为必需品。有许多第三方搜索引擎可以安装在您的网站上,但对于许多用途来说,IIS 自带的 Index Server 已足够。什么是 Index Server?在线文档将其概括如下:

索引服务是 Microsoft® Windows® 2000 服务,它索引您磁盘上的文件及其属性,以及您的 Internet Information Services (IIS) Web 文件和属性。索引服务将结果信息存储在目录中,您可以通过各种查询高效地搜索这些目录。

Index Server 允许您使用 ADO 和 OLE DB 对服务运行查询。这提供了易用性和灵活性,以提供搜索功能。

Index Server 对象

Index Server 的创建方式与其他 COM 对象一样,都在您的服务器上创建。

dim ixQuery   ' Index Server query object.
set ixQuery = Server.CreateObject("ixsso.Query")

该对象有许多属性可以在运行查询之前设置。最有用的属性是 **Columns**、**SortBy**、**MaxRecords** 和 **Query** 属性。

Columns

**Columns** 属性允许您指定查询返回哪些字段。有关完整列表,请参阅在线文档,但对于当前示例,我们将返回以下内容:

doctitle
页面标题(在 <TITLE>...</TITLE> 元素中指定)
vpath
页面的虚拟路径
size
页面大小
characterization
页面的描述
rank
指定页面与搜索条件匹配程度的值
ixQuery.Columns = "doctitle, vpath, size, characterization, rank"

SortBy

**SortBy** 指定匹配项的排序方式。按相关的排序顺序列出字段,并使用“[d]”指定该字段应按降序排序。

ixQuery.SortBy = "rank[d], doctitle"

MaxRecords

您应该限制查询返回的匹配项数量——用户在任何情况下可能只浏览前几十个。

ixQuery.MaxRecords = 300

Catalog

目录(Catalog)代表特定目录(或目录)的索引结果。如果您未指定目录,则 Index Server 将使用默认的“web”目录,该目录索引 /inetpub/wwwroot。有时您可能希望指定一个目录(例如,如果您的网站位于其他目录中,或者您想为不同的搜索页面创建多个目录)。

添加目录

要设置目录,请在计算机管理控制台的“服务和应用程序”分支下的 **索引服务** 分支中(在“开始”->“程序”->“管理工具”下)。右键单击 **索引服务**,然后选择“新建”->“目录”。输入新目录的名称以及索引文件应存储的位置。单击“确定”,然后右键单击新创建的目录并选择“新建”->“目录”。添加您希望索引的目录,并根据需要重复。子目录也将自动被索引。您还可以指定目录树中不应被索引的目录。为此,请添加您希望忽略的目录,然后在 **索引此资源** 框中选择 **否**)。通常,您会添加一个要索引的目录树,然后可能希望指定该目录层次结构下的某些子目录不被索引。这为您提供了对索引内容的粗粒度控制。

Sample Image - new_catalog.GIF

确保目录为您的搜索生成摘要

如果您希望您的目录包含被索引文件的摘要,则需要右键单击目录并选择“属性”。单击 **生成** 选项卡,并确保选中 **生成摘要** 复选框。如果它被禁用,则取消选中 **继承服务以上设置** 复选框。然后,您可以设置要生成的摘要的大小。

Sample Image - new_catalog.GIF

确保搜索为您的搜索生成正确的 vpath

要确保索引搜索为搜索生成正确的虚拟路径 (vpath),您应该将目录与 Web 服务器关联。在计算机管理控制台的“索引服务”下,右键单击您的目录并选择“属性”。单击 **跟踪** 选项卡,然后从“WWW 服务器”下拉列表中选择您的服务器。

Sample Image - vpath.GIF

在搜索中指定要使用的目录

通过添加以下内容在搜索中指定要使用的目录:

ixQuery.Catalog = "CodeProject"

启动 Internet 服务管理器,打开您网站的属性对话框,选择“主目录”选项卡,并确保选中“索引此资源”复选框。

Sample Image - indexing_on.GIF

您还需要确保资源管理器中的文件夹属性设置为允许索引该文件夹。导航到包含您网站文件所在的文件夹,右键单击您的网站文件夹并选择“属性”,单击“高级”,然后选中“为了快速搜索,允许索引服务索引此文件夹”。

感谢 Kurt 和 Izidor Gams 的更新。

查询

实际查询。这是整个操作的核心。Index Server 支持 3 种查询语言:方言 1 (Index Server 1.0)、方言 2 (Index Server 3.0) 和 SQL (Index Server 2.0 及更高版本)。有关这些不同语言的完整说明,请参阅 MSDN 中的“索引服务的查询语言”主题。

在我们的例子中,我们将使用简单的方言 1——尽管如果您愿意,使用熟悉的 SQL 语法同样容易。

最简单的方法是直接将 Index Server 对象的 Query 属性设置为搜索目标。例如,如果您要查找所有包含单词“Apples”的页面,请使用:

ixQuery.Query = "Apples"

我们可以通过指定将搜索哪些文件以及不搜索哪些文件,查询的解释方式(作为短语、作为自由文本搜索、作为精确匹配等)以及搜索的页面类型(例如,仅搜索特定日期之后或小于特定大小的页面)来进一步细化。

例如,要指定对短语“Apples are green”的自由文本搜索,请使用:

$contents Apples are green

要指定字段限制,请在预定义字段名称前加上“@”前缀,后跟一个表达式。例如:

@size < 1000000     ' size must be less than 1,000,000 bytes
@contents apple tree   ' Contents must contain the phrase "apple tree"
@write > 70/10/24   ' Page must have been written after October 24, 1970

文件名限制可以通过使用“#”前缀指定正则表达式搜索和通配符来指定;

#filename *.asp        ' search only ASP files
#vpath *\articles*     ' search in the \articles subdirectory

所有这些表达式都可以使用布尔运算符 AND、NOT、OR 等组合。因此,如果您的搜索目标表达式是“Apples”,您只想搜索 ASP 文件,并且您想忽略 \_vti 目录,请使用以下方法:

ixQuery.Query = "(#filename *.asp) AND (NOT #vpath *\_vti*) AND (Apples)"

Index Server Utility 对象

与 Index Server 对象相关的一个对象是 Index Server Utility 对象。它允许您指定搜索的深度——可以是“浅”(仅针对指定目录)或“深”(递归搜索所有子目录)。

dim util
set util = Server.CreateObject("ixsso.Util")
util.AddScopeToQuery ixQuery, Server.MapPath("/"), "deep"

第一个参数指定要将实用程序关联的 Index Server 对象;第二个参数指定开始搜索的物理路径(在我们的例子中是根文件夹);第三个参数指定搜索类型。

执行搜索

要运行实际查询,只需调用 `Query.CreateRecordset`。

dim queryRS   ' Query recordset.

set queryRS = ixQuery.CreateRecordSet("nonsequential")

显示结果

要显示结果,只需遍历记录集。

Response.Write "<table width='100%'>"
do while not queryRS.EOF

	' Get the document title. If it's blank, set it to "Untitled".

	dim docTitle
	docTitle = queryRS("doctitle")

	if docTitle = "" then docTitle = "Untitled"

	' Show the record #, link to the document, URL, and characterization.

	Response.Write "<tr>"
	Response.Write "<td valign=top>" 
	Response.Write recordNumber & ".</td>"
	Response.Write "<td valign=top>"
	Response.Write "<a href='" & queryRS("vpath") 
	Response.Write "'>" & docTitle & "</a><br>"
	Response.Write "<b>URL: </b> http://" 
	Response.Write Request.ServerVariables("server_name") 
	Response.Write queryRS("vpath") & "<br>"
	Response.Write Server.HTMLEncode(queryRS("characterization")) ' The abstract

	Response.Write "</td>"
	Response.Write "</tr>"

	recordNumber = recordNumber + 1
	queryRS.MoveNext()
	
loop
Response.Write "</table>"

演示脚本

示例脚本将所有这些内容结合在一起,并演示了如何为用户提供按页面查看结果的功能。欢迎您在自己的网站上使用和自定义此脚本。

历史

2000 年 6 月 16 日 - 发布
2001 年 4 月 23 日 - 更新以修复分页问题(感谢 Khaled)
2001 年 7 月 29 日 - 更新以包含有关生成摘要的信息
2001 年 10 月 31 日 - 更新以包含有关生成 vpath 和确保索引正常工作的信息

© . All rights reserved.