在网站开发过程中,为用户提供搜索功能是一项非常实用的功能。虽然有许多第三方搜索引擎可以安装在网站上,但对于许多目的而言,IIS自带的索引服务已经足够使用。索引服务是什么?在线文档简洁地定义如下:
索引服务是微软Windows 2000服务,它索引磁盘上的文件及其属性,以及Internet信息服务(IIS) Web文件和属性。索引服务将这些信息存储在目录中,可以使用各种查询高效地搜索这些目录。
索引服务允许使用ADO和OLE DB对服务进行查询,这提供了易于使用和灵活性,以便提供搜索功能。
索引服务对象的创建类似于服务器上的任何其他COM对象:
Dim ixQuery
Set ixQuery = Server.CreateObject("ixsso.Query")
该对象在运行查询之前有许多可以设置的属性。最有用的属性包括:
Columns属性允许指定查询返回哪些字段。完整的字段列表请参考在线文档,但在此示例中将返回以下字段:
ixQuery.Columns = "doctitle, vpath, size, characterization, rank"
SortBy属性指定匹配项将如何排序。列出相关排序顺序的字段,并使用"[d]"指定该字段应以降序排序。
ixQuery.SortBy = "rank[d], doctitle"
应该限制查询返回的匹配项数量 - 用户通常只会浏览前几十个结果。
ixQuery.MaxRecords = 300
目录代表特定目录(或目录)的索引结果。如果没有指定目录,则索引服务将使用默认的'web'目录,该目录索引/inetpub/wwwroot。有时可能想要指定目录(例如,如果网站位于不同的目录,或者想要为不同的搜索页面拥有多个目录)。
要设置目录,请转到计算机管理控制台中的“索引服务”分支下的“服务和应用程序”分支。右键单击“索引服务”,然后选择新建->目录。输入新目录名称和索引文件应存储的位置。点击确定,然后右键单击新创建的目录并选择新建->目录。添加希望建立索引的目录,并根据需要重复此操作。子目录将自动被索引。还可以指定目录树中不应被索引的目录。为此,请添加希望被忽略的目录,然后点击“否”在“索引此资源”框中。
通常,会添加一个目录树以进行索引,然后可能想要指定该目录层次结构下的某些子目录,不希望它们被索引。这为提供了一些粗粒度的控制,以确定哪些内容被索引。
如果希望目录包含索引文件的摘要,则需要右键单击目录并选择属性。点击“生成”标签,并确保选中“生成摘要”复选框。如果它被禁用,则取消选中“从服务继承上述设置”框。然后,可以设置要生成的摘要大小。
要确保索引搜索为搜索生成正确的虚拟路径(vpaths),应该将目录与Web服务器关联。在计算机管理控制台下的“索引服务”中,右键单击目录并选择属性。点击“跟踪”标签,并从“WWW服务器”下拉菜单中选择服务器。
通过添加以下内容来指定要在搜索中使用的目录:
ixQuery.Catalog = "CodeProject"
启动Internet服务管理器,打开网站的属性对话框,选择“主目录”标签,并确保选中“索引此资源”复选框。
还需要确保资源管理器中的文件夹属性设置为允许文件夹被索引。导航到包含网站文件的文件夹,右键单击网站文件夹并选择属性,点击“高级”并选中“为了快速搜索,允许索引服务索引此文件夹”。
实际的查询。这是整个操作的核心。索引服务支持3种查询语言:方言1(索引服务1.0),方言2(索引服务3.0)和SQL(索引服务2.0及以上)。有关这些不同语言的完整解释,请参见MSDN中的主题“索引服务的查询语言”。
在例子中,将使用简单的方言1 - 尽管使用熟悉的SQL语法同样容易。
最简单的,可以将索引服务对象的Query属性设置为搜索目标。例如,如果正在寻找所有包含单词“Apples”的页面,可以使用:
ixQuery.Query = "Apples"
可以通过指定将要搜索和不搜索的文件,想要的查询解释方式(作为短语,作为自由文本搜索,作为完全匹配等),以及将要搜索的页面类型(例如,仅在某个特定日期之后编写的页面,或小于某个特定大小的页面)来进一步细化这一点。
例如,要指定对短语“Apples are green”进行自由文本搜索,请使用:
$contents Apples are green
要指定字段限制,请使用“@”前缀指定预定义字段名称,并使用表达式。例如:
@size < 1000000 ' size必须小于1,000,000字节
@contents apple tree ' 内容必须包含短语“apple tree”
@write > 70/10/24 ' 页面必须在1970年10月24日之后编写
可以通过使用“#”前缀指定正则表达式搜索,并使用通配符来指定文件名限制;
#filename *.asp ' 仅搜索ASP文件
#vpath *\articles* ' 在\articles子目录中搜索
所有这些表达式都可以使用布尔运算符AND,NOT,OR等组合。因此,如果搜索目标表达式是“Apples”,只想在ASP文件中搜索,并且想忽略\_vti目录,请使用以下内容:
ixQuery.Query = "(#filename *.asp) AND (NOT #vpath *\_vti*) AND (Apples)"
与索引服务对象相关的另一个对象是索引服务实用工具对象。这允许指定搜索的深度 - 无论是“浅”(仅命名目录)还是“深”(对所有子目录进行递归搜索)。
Dim util
Set util = Server.CreateObject("ixsso.Util")
util.AddScopeToQuery ixQuery, Server.MapPath("/"), "deep"
第一个参数指定要将实用工具与索引服务器对象关联;第二个参数指定开始搜索的物理路径(在例子中是根文件夹);第三个参数指定搜索类型。
要运行实际查询,只需调用Query.CreateRecordset:
Dim queryRS
Set queryRS = ixQuery.CreateRecordSet("nonsequential")
Response.Write("")
Do While Not queryRS.EOF
Dim docTitle
docTitle = queryRS("doctitle")
If docTitle = "" Then docTitle = "Untitled"
Response.Write("")
Response.Write("" & recordNumber & ". ")
Response.Write("
")
Response.Write("URL: http://" & Request.ServerVariables("server_name") & queryRS("vpath") & "
")
Response.Write(Server.HTMLEncode(queryRS("characterization")))
Response.Write(" ")
Response.Write(" ")
recordNumber = recordNumber + 1
queryRS.MoveNext()
Loop
Response.Write("
")