本章要点
Windows索引服务可以实现对文件的全文搜索,如果使用Windows服务器来架设搜索引擎,这是一个可选的方案。本章介绍如何基于Windows索引服务来架设全文搜索引擎。
7.1Windows索引服务的基本应用
7.1.1Windows索引服务的基本原理
Windows索引服务的工作原理是:Windows对指定的路径内的文件执行全文索引,然后再执行全文搜索。Windows索引服务的使用非常简单。
索引服务提供用于几种流行文件格式(如Microsoft Word、Microsoft Power Point、Microsoft Excel和HTML)的筛选。筛选还可用于纯文本。用户和第三方供应商也可以编写用于其他格式的筛选。筛选的一个目的是对非纯文本文档提供支持,另一个目的是从文件内容获取属性值,以及获取关于文件的属性值。
文件系统检索的全文索引是通过扫描文件的内容创建的。该过程包括跟踪所使用的重要单词及其所在的位置。例如,全文索引可以指示在给定文件的第227、473、1017个单词处找到了单词Canada。此索引结构支持对包含索引单词的所有项进行高效检索,以及进行高级检索操作,如短语检索和邻近检索。例如:查找“white elephant”,其中的white在elephant前面,这是短语检索;查找其中的big出现在house附近的短语,这是邻近检索为了防止全文索引因包含很多对检索没有帮助的词而变得臃肿,干扰词(如a、and和the)都被忽略不计。
索引服务提供了许多语言的干扰词列表,而且所支持的语言集也在增长。在筛选过程中,选择哪个干扰词列表取决于资料的语言,而该资料依赖于文件格式——有些文件按部分(例如,按段落)进行语言设置,而有些作为文档的属性指定语言设置。对于大多数标准操作,这些干扰词列表应该足够了,但是也可以用文本编辑器进行修改,以用于特定的环境。
索引服务在文本检索目录中存储索引和属性值。默认情况下,在安装索引服务时会创建名称为Web的文本检索目录。一个给定的文本检索目录引用一个或多个IIS虚拟目录(也称为虚拟根目录),一个虚拟目录引用一个或多个物理目录,以及(可选的)其他虚拟目录。在真正的文件通过虚拟目录链接到文本目录之后,将会通知索引服务必须对哪些新文件进行索引,于是索引服务开始对与这些文件相关的属性和内容进行筛选和索引。以后如果要对这些文件进行任何更改,都会通知索引服务,索引服务会对更新的文件重新筛选并重新建立索引。
7.1.2Windows索引服务的基本使用
下面的例子演示对一个文件夹内的所有文件建立全文索引,然后执行搜索。
首先,鼠标右键单击“我的电脑”图标,从弹出的快捷菜单中选择“管理”。
然后在打开的“计算机管理”窗口中找到“索引服务”节点,这就是我们需要使用的Windows索引服务。
笔者在E:docs目录下存放了一些Word文档(也可以掺杂HTML等格式的文档)。现在,要做的是对这些文档执行全文搜索。
在“索引服务”节点处,单击鼠标右键,从弹出的快捷菜单中选择“新建”中的“编录”选项,弹出“添加编录”对话框,在其中输入编录的“名称”和“位置”。这里输入名称为“tianen”,输入位置“E:docs”。
单击“确定”按钮,系统将弹出提示对话框,提示编录已经创建成功。
在提示对话框中单击“确定”按钮。这时可以看到在E:docs目录下有一个名为“catalog.wci”的目录出现,这是一个隐藏目录。
然后,在刚刚建立的编录“tianen”节点下面找到“目录”节点,单击鼠标右键,在弹出的快捷菜单中依次选择“新建”中的“目录”选项。
弹出“添加目录”对话框,在其中设定路径为“E:docs”,然后单击“确定”按钮。
在“计算机管理”窗口中单击“索引服务”节点。在上方的工具栏中单击“启动”按钮,启动索引服务。如果原本就处于启动状态,就先“停止”,然后再启动。
这时,查看E:docscatalog.wci目录,可以发现里面新增了许多文件。这些文件就是建立的索引文件。
在“tianen”节点处,选择其子节点“查询编录”,将显示出查询表单,在其中输入关键词,单击“搜索”按钮,即可显示搜索结果。如果搜索“女娲”,显示出了“后土.doc”文件,这就说明系统执行了全文搜索。
从“索引服务查询表格”输入的查询,一般情况下不限制文本格式。要使用索引服务查询语言的高级功能,可以单击“高级查询”,允许查询特殊的属性并受益于查询语言的强大功能,如分量、向量和布尔查询。
7.1.3索引服务的性能的基本调整方法
下面介绍一些简单的方法,可以对索引服务的性能进行调整。
在“计算机管理”窗口中,用鼠标右键单击“索引服务”,在弹出的快捷菜单中依次选择“所有任务”和“调整性能”。
弹出“索引服务用法”对话框,在其中选择“自定义”,然后单击“自定义”按钮。
弹出“所需性能”对话框,在其中将“索引”和“查询”的移动滑标移动到最右边。这样,索引服务将消耗最多的系统资源,但是具有最好的性能。
7.2Windows索引服务与SQL Server数据库的联合使用
7.2.1将索引服务和SQL Server数据库关联
索引服务包括用于Microsoft索引服务的Microsoft OLEDB提供程序。此提供程序可用来对非数据库文件进行全文索引或属性值搜索。可使用sp addlinkedserver完成链接服务器定义,并使用SQL Server企业管理器进行安全设置。然后,分布式查询可引用提供程序以检索索引信息。
创建链接服务器以访问索引服务全文索引的方法如下面的例子所示。
若要创建名为tianen Index的链接服务器服务访问名为tianen的全文索引(就是刚才建立索引编录的名字),执行如下语句:
sp addlinkedserver tianen Index,"Index Server","MSIDXS","tianen"
现在,就可以在SQL Server中执行搜索了。执行下面的语句:
SELECT Q.*
FROM OpenQuery
(
——链接服务器名
tianenIndex,
——搜索语句
"SELECT FileName,Size,DocAuthor,path FROM SCOPE()WHERECONTAINS(""女娲"")′
)AS Q
这里要注意,在CONTAINS子句后面的括号中,关键词左右两侧是两个单引号,而不是双引号。
7.2.2基于索引服务的Web应用
现在,我们开发一个Web应用。实现的原理很简单:向SQL Server中提交语句,然后由SQL Server返回数据即可。使用的技术是ASP.NET1.1(基于VB.NET)。
案例名称:基于索引服务的Web应用
程序名称:tianenIndex.aspx
<%@ Import Namespace="System.Data"%>
<%@ Import Namespace="System.Data.SqlClient"%>
< language="VB"runat="server">
Sub Page Load(SenderAs Object,EAs EventArgs)
Dim connAs New SqlConnection("server=localhost;database=pubs;uid=sa;pwd=;")
dim sqlAs String="SELECT Q.* FROM OpenQuery(tianenIndex,"SELECT FileName,
Size,DocAuthor,path FROM SCOPE()WHERECONTAINS(""女娲"")")AS Q"
Dim cmdAs New SqlCommand(sql,conn)
Dim drAs SqlDataReader
try
conn.Open()
dr=cmd.ExecuteReader()
while dr.read
response.write(dr("filename")&;"——"&; dr("size")&;"——"&; dr("path")&;"
<br>")
end while
catch ex as Exception
response.write("出错了!")
finally
if not dr is nothing then
dr.close
end if
if not conn is nothing then
conn.close
end if
end try
End Sub
</>
上面例子只为说明原理。下面在其基础上进行改进,增加一个搜索栏。
案例名称:基于索引服务的Web应用
程序名称:tianenSearcher.aspx
<%@ Import Namespace="System.Data"%>
<%@ Import Namespace="System.Data.SqlClient"%>
< language="VB"runat="server">
SubButton1Click(ByVal senderAs System.Object,ByVal eAs System.EventArgs)
Dim connAs New
SqlConnection("server=localhost;database=pubs;uid=sa;pwd=;")
dim sqlAs String="SELECT Q.* FROM OpenQuery(tianenIndex,"SELECT FileName,
Size,DocAuthor,path FROM SCOPE()WHERECONTAINS("′"+so.Text+"′")")AS Q"Dim cmdAs New SqlCommand(sql,conn)
Dim drAs SqlDataReader
try
conn.Open()
dr=cmd.ExecuteReader()
while dr.read
response.write(dr("filename")&;"——"&; dr("size")&;"——"&; dr("path")&;
"<br>")
end while
catch ex as Exception
response.write("出错了!")
finally
if not dr is nothing then
dr.close
end if
if not conn is nothing then
conn.close
end if
end try
End Sub
</>
<FORM id="Form1"method="
post
"runat="server">
<asp:textbox id="so" runat="server"/> ;
<asp:button id="Button1"runat="server"Text="搜索"OnClick="Button1Click"></asp:
button><BR>
</FORM>
在搜索栏中输入“女娲”,单击“搜索”按钮。
7.3一个完整的应用
7.3.1建立索引编录
在讲解了相关理论并作了测试之后,现在提供一个完整的应用。
建立E: est文件夹,放入若干文件。
使用Windows索引服务建立编录,名为“test”(这个名字是任意的,不需要与前面提到的文件夹名字相同),使其路径为“E: est”文件夹。
在刚刚建立的编录test下面添加一个目录,设定目录路径为“E: est”。
在“计算机管理”对话框中单击“启动”按钮,启动索引服务。
单击“查询编录”节点,在搜索页面中,搜索“共工”,可以看到搜索结果,这说明索引建立成功了。
7.3.2Web搜索
前面已经说明了使用SQL Server作为媒介来实现Web页面搜索的方法,这里就不重复了。
显然,如果读者的服务器上有SQL Server,那无疑是很好的,已经可以建立全文搜索引擎了。
这里要介绍的系统,并没有采用SQL Server作为媒介。没有SQL Server,也可以实现Web全文搜索引擎。
首先,要做一些准备工作。在“索引服务”下面的“test”节点处单击鼠标右键,在弹出的快捷菜单中选择“属性”。
弹出“test属性”对话框,在“生成”选项卡中选择“生成摘要”复选框,这样将使搜索出来的结果可以含有文章内容的摘要。
然后,在“跟踪”选项卡的“WWW服务器”下拉菜单中选中“默认网站”。