让Google成为站点的搜索引擎

网络通信

  在制作搜索网页时,常见的通过内置Google引擎表单的方法不能实现Google的复杂搜索功能。而一般的站内搜索,又对服务器的资源要求过高。有没有更好的解决办法呢?

  下面我们就开始一步步讲解如何在ASP.Net中使用Google Web APIs服务,借助强大的通用搜索引擎Google来打造我们自己的站点搜索引擎(图1为用此技术的网站站内Google搜索网页)。

  下载开发包

  开发包提供了如何使用Google Web APIs服务的文档及示例代码。开发包的下载地址是:http://api.google.com/googleapi.zip。

  创建账户

  要想使用Google Web APIs服务提供的功能,必须先申请一个Google 账户以获得授权密钥(license key)。账户申请地址为:http://www.google.com/accounts/New Accountcontinue=http://api.google.com/createkey&followup=http://api.google.com/createkey,在提交了有效的邮箱地址及账户密码后,Google会先发一封验证邮件给你,收到邮件后,点击邮件中的验证链接,以激活账户。激活账户后,Google会再发给你一封邮件,其中含有我们需要的授权密钥。

  创建服务

  为方便大家动手演练,我们选择小巧免费的ASP.NET Web Matrix(下载地址为:http://download.microsoft.com/download/7/c/9/7c9e69f0-da4e-4f57-9659-02e762bb9053/WebMatrix.msi)。

  1.创建及设计搜索页面

  首先,启动ASP.NET Web Matrix,通过“File→New File”菜单项,打开Add New File对话框,在Templates中选择“General→ASP.NET Page”,并设置好搜索页面文件所在的Location(文件夹位置)及Filename(文件名),Language选择C#,然后点“OK”按钮即可。

  接下来,在新建搜索页面文件的设计视图模式下开始页面设计(也可在Dreamweaver等专业设计软件中进行设计,然后在HTML视图模式中把页面HTML代码复制粘贴过来),在这里我们仿照Google的高级搜索页面设计了一个最简单的页面(图2)。

  2.生成Web服务代理类

  要使我们的程序与Google Web APIs服务能通过Internet进行正常通信,需要一个Web 服务代理类。在ASP.NET Web Matrix中,我们使用Web服务代理生成器,通过“Tools→WebService Proxy Generator”菜单命令访问。打开Web服务代理生成器对话框后,按图3所示进行设置,最后点Generate按钮生成代理类,在出现代理类已生成的提示框后,关闭Web服务代理生成器对话框。

  3.添加服务器端执行代码

  切换到代码视图模式中,点击View→Code操作菜单,加入代码(此处代码可以在http://www.cpcw.com/1/Goole.zip下载)。在这段代码中,大家需要注意两点:

  (1)使用doGoogleSearch

  我们把查询参数传递给doGoogleSearch,然后发出Google Web APIs服务请求,返回搜索结果。

  doGoogleSearch的完整声明如下:public GoogleSearchResult doGoogleSearch(string key, string q, int start, int maxResults, bool filter, string restrict, bool safeSearch, string lr, string ie, string oe)。

  它接受10个参数,分别为key:我们申请Google账户时获得的授权密钥;q:查询条件;start:所请求的第一个搜索结果项的索引号(基于0);maxResults:每次查询返回的结果项数(最大为10);filter:是否过滤掉非常类似的搜索结果和来自同一主机的搜索结果;restrict:将搜索限定在Google Web索引子集内(比如国家或linux、mac等主题);safeSearch:是否过滤掉搜索项中的成人(未成年人不宜)内容;lr:语言限制(只搜索使用指定语言的文档,简体中文为lang_zh-CN);ie:输入字符串编码(本参数现在是忽略的,指定空字符串即可);oe:输出字符串编码(本参数现在是忽略的,指定空字符串即可)。

  对于filter与safeSearch参数,我们都设置为false,因为在实测过程中发现当它们设置为true时,会导致搜索结果的不确定性,即我们无法通过获取搜索结果最后一页最后一项的索引来确定搜索结果总数,没有搜索结果总数,就无法正常使用数据网格的分页导航功能。

  (2)通过会话变量缓存查询条件

  缓存查询条件使得访问者在搜索结果网格的各页间导航,而且搜索条件未变时不再重新处理查询参数。由于每个授权密钥每天只能提交1000次查询,如果不保存搜索结果数,则访问者每次搜索实际上要提交两次,一次获得结果总数,一次获得搜索结果,这样非常消耗查询次数。对此限制更进一步的做法是申请多个授权密钥,并通过一个应用程序变量(如Application["querycount"])来计数,每满1000次即换一个密钥以及用XML直接缓存搜索结果。

  最后切换到All视图模式下加入Page指令如下:

  <%@ Page Language="C#" CodePage="936"%>

  至此,搜索引擎就大功告成了,保存所做修改,按F5键,在Start Web Application对话框中选择启动方式(图4),然后点击Start按钮开始运行测试。

  运行测试无误就可以发布到我们的服务器上了。要上传的文件除了搜索页面以及相关图片、CSS文件外,还要记得上传bin目录中GoogleProxyClass.dll文件,并把它也放在服务器应用程序根目录的bin子目录中。