为您的网站添加搜索功能






4.84/5 (41投票s)
使用 Microsoft Index Server 为您的读者提供网站搜索功能
引言
一旦网站开始增长,搜索功能就成为必需品。有许多第三方搜索引擎可以安装在您的网站上,但对于许多用途来说,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。有时您可能希望指定一个目录(例如,如果您的网站位于其他目录中,或者您想为不同的搜索页面创建多个目录)。
添加目录
要设置目录,请在计算机管理控制台的“服务和应用程序”分支下的 **索引服务** 分支中(在“开始”->“程序”->“管理工具”下)。右键单击 **索引服务**,然后选择“新建”->“目录”。输入新目录的名称以及索引文件应存储的位置。单击“确定”,然后右键单击新创建的目录并选择“新建”->“目录”。添加您希望索引的目录,并根据需要重复。子目录也将自动被索引。您还可以指定目录树中不应被索引的目录。为此,请添加您希望忽略的目录,然后在 **索引此资源** 框中选择 **否**)。通常,您会添加一个要索引的目录树,然后可能希望指定该目录层次结构下的某些子目录不被索引。这为您提供了对索引内容的粗粒度控制。
确保目录为您的搜索生成摘要
如果您希望您的目录包含被索引文件的摘要,则需要右键单击目录并选择“属性”。单击 **生成** 选项卡,并确保选中 **生成摘要** 复选框。如果它被禁用,则取消选中 **继承服务以上设置** 复选框。然后,您可以设置要生成的摘要的大小。
确保搜索为您的搜索生成正确的 vpath
要确保索引搜索为搜索生成正确的虚拟路径 (vpath),您应该将目录与 Web 服务器关联。在计算机管理控制台的“索引服务”下,右键单击您的目录并选择“属性”。单击 **跟踪** 选项卡,然后从“WWW 服务器”下拉列表中选择您的服务器。
在搜索中指定要使用的目录
通过添加以下内容在搜索中指定要使用的目录:
ixQuery.Catalog = "CodeProject"
启动 Internet 服务管理器,打开您网站的属性对话框,选择“主目录”选项卡,并确保选中“索引此资源”复选框。
您还需要确保资源管理器中的文件夹属性设置为允许索引该文件夹。导航到包含您网站文件所在的文件夹,右键单击您的网站文件夹并选择“属性”,单击“高级”,然后选中“为了快速搜索,允许索引服务索引此文件夹”。
感谢 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 和确保索引正常工作的信息