聚合搜索(五)

前端之家收集整理的这篇文章主要介绍了聚合搜索(五)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_502_0@ 1.5 聚合搜索的实现
上面介绍了服务器端基础类代码的实现。本节将整合这些代码,具体实现聚合搜索功能。Search.aspx是本系统的主页面文件。它是一个框架,顶部是Top.htm页面,用于选择搜索引擎和执行查询底部是一个由Handler生成页面S.ashx,用于执行具体的查询任务。Search.xml存储了6大搜索引擎的相关信息,而result.xsl是搜索结果的格式化文件。下面具体介绍它们的实现。
@H_502_0@ 1.5.1 主页面Search.aspx
Search.aspx是聚合搜索的主页面,实际上它是一个框架,由Top.htm和S.ashx两个页面组成。它只是负责给两个页面传递查询参数,其具体代码如下:
// Search.aspx的代码
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3. org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
public string key = ""; //当前搜索关键字
public string no = ""; //当前搜索引擎的编号
public string str = "var location='';"; //输出到客户端的脚本
protected void Page_Load(object sender,EventArgs e)
{
key = Server.UrlEncode(Server.UrlEncode(Tools.getPostItem("key")));
no = Tools.getPostItem("no");
str = "";
if (no == "") no = "9"; //no默认为9,google搜索
if (key == "") key = "趣查";
str += "var s_key='" + key + "';var s_no=" + no + ";";
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>聚合搜索</title>
<Meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<script type="text/javascript">
<%=str %>
</script>
</head>
<frameset name="topframe" border="0" rows="130px,*" frameborder="0" framespacing="0"
runat="server">
<frame name="search_engine" scrolling='no' src="<%=Tools.getApplicationPath() %>Top.htm?keyword=<%=Tools.getPostItem("key") %>&NO=<%= no%>">
scrolling="no">
<frame name="right" id="other" src="S.ashx?Times=1&key=<%= key %>&no=<%= no%>" noresize
frameborder="0" marginwidth="0" marginheight="0" scrolling="auto">
</frameset>
<noframes>
此 HTML 框架集显示多个 Web 页。若要查看此框架集,请使用支持 HTML 4.0 及更高版本的 Web 浏览器。
</noframes>
</html>
@H_502_0@ 1.5.2 搜索页面Top.htm
搜索页面Top.htm包括一个文本输入框、一个提交按钮和一个搜索引擎列表,它是用户执行查询操作的页面页面初始化时,首先生成一个搜索引擎数组(这个数组和服务器端的Search.xml文件对应),初始化搜索引擎列表。单击“搜索”按钮后,页面中的相关数据被POST到Search.aspx页面上,然后执行实际的搜索任务。Top.htm的具体代码如下:
@H_502_0@ <html xmlns="http://www.w3.org/1999/xhtml">
@H_502_0@ <head>
@H_502_0@ <title>聚合搜索</title>
@H_502_0@ <Meta http-equiv="Content-Type" content="text/html; charset=gb2312">
@H_502_0@ <script type="text/javascript" src="xmlhttp.js"></script> @H_502_0@ <style type="text/css"> @H_502_0@ .currentSearch{color:Red;font:Bold;} @H_502_0@ .innerBody{width:98%;text-align:center; font-size:12px} @H_502_0@ </style> @H_502_0@ </head> @H_502_0@ <body> @H_502_0@ <div class="innerBody"> @H_502_0@ <h3> @H_502_0@ <span style="color: #ff0033">聚合搜索</span></h3> @H_502_0@ <form action="search.aspx" method="get" id="fram2" target="_top" name=
"my_search"> @H_502_0@ <input name="key" type="text" id="s_soutext" style="font-size: 16px"
value="趣查" size="40" /> @H_502_0@ <input name="no" type="hidden" id="s_souvalue" value="11" /> @H_502_0@ <input type="button" class="button" style="font-size: 14px; padding-top:
2px" onclick="s_souclick3();" @H_502_0@ value=" 搜 索" /></form> @H_502_0@ <div id="searchListCon"> @H_502_0@ </div> @H_502_0@ </div> @H_502_0@ <script type="text/javascript"> @H_502_0@ //搜索引擎数组。类别,value,text。 @H_502_0@ var s_sou = new Array(); @H_502_0@ s_sou[0] = new Array(9,"谷歌(google)"); @H_502_0@ s_sou[1] = new Array(11,"搜狗(sogou)"); @H_502_0@ s_sou[2] = new Array(8,"百度(baidu)"); @H_502_0@ s_sou[3] = new Array(13,"雅虎(yahoo)"); @H_502_0@ s_sou[4] = new Array(10,"爱问(iask)"); @H_502_0@ s_sou[5] = new Array(14,"中搜(zhongsou)"); @H_502_0@ function search_init() //初始化页面 @H_502_0@ { @H_502_0@ var url=window.location.search;//url @H_502_0@ var zid=9; //搜索引擎编号 @H_502_0@ if(url) @H_502_0@ { @H_502_0@ var mt=url.match(/keyword=([^&]+)/i) @H_502_0@ if(mt) //如果存在搜索关键字,搜索框中显示关键字 @H_502_0@ { @H_502_0@ setHtmlElementValue($('s_soutext'),(mt[1])); @H_502_0@ } @H_502_0@ var mb = url.match(/no=([/d]+)/i); //搜索引擎编号 @H_502_0@ if(mb) @H_502_0@ { @H_502_0@ zid=mb[1]; @H_502_0@ } @H_502_0@ } @H_502_0@ var searchStr=new Array(); //所有的搜索引擎的字符串 @H_502_0@ for(var i=0;i<s_sou.length ;i++) //遍历数组,构造搜索引擎字符串 @H_502_0@ { @H_502_0@ var ta = s_sou[i]; @H_502_0@ if (ta[0]==zid) //当前选中的搜索引擎 @H_502_0@ searchStr.push('<a class="currentSearch" href=S.ashx?Times=1&key='+$ ("s_
soutext").value + '&no=' + ta[0] + ' target="right" id=a'+ ta[0] +' onclick="search Click(this);">'+ ta[1] +'</a>'); @H_502_0@ else @H_502_0@ searchStr.push('<a href="S.ashx?Times=1&key=' + $("s_soutext").value + '&no=' + ta[0] + '" target="right" id=a'+ ta[0] +' onclick="searchClick(this);">' + ta[1] + '</a>'); @H_502_0@ } @H_502_0@ $("s_souvalue").value= zid; @H_502_0@ // 显示搜索引擎 @H_502_0@ $("searchListCon").innerHTML = "选择搜索引擎:" + searchStr.join("&nbsp;"); @H_502_0@ } @H_502_0@ function searchClick(obj) //单击搜索引擎后,搜索引擎的css改变 @H_502_0@ { @H_502_0@ var obj2 = $("searchListCon"); @H_502_0@ var temp = obj2.getElementsByTagName("a"); @H_502_0@ for(var i=0;i<temp.length;i++) //遍历各搜索引擎 @H_502_0@ { @H_502_0@ if(temp[i]==obj) //当前搜索引擎 @H_502_0@ temp[i].className='currentSearch'; @H_502_0@ else @H_502_0@ temp[i].className=''; @H_502_0@ } @H_502_0@ return true; @H_502_0@ } @H_502_0@ function s_souclick3() //单击搜索按纽 @H_502_0@ { @H_502_0@ key = $("s_soutext").value; @H_502_0@ if(key=="") //搜索关键字为空 @H_502_0@ { @H_502_0@ alert("请输入搜索内容。"); @H_502_0@ return false; @H_502_0@ } @H_502_0@ $("fram2").submit(); @H_502_0@ } @H_502_0@ search_init(); //初始化显示 @H_502_0@ </script> @H_502_0@ </body> @H_502_0@ </html> @H_502_0@ 1.5.3 搜索信息文档Search.xml
Search.xml存储的是和各搜索引擎相关的信息,如查询的URL、查询字符串的格式、所使用的搜索类等。执行搜索时,程序首先读取这些信息,构造成查询的URL和查询字符串。各搜索引擎是以对应的“id”来区分的。Search.xml的具体代码如下:
@H_502_0@ <?xml version="1.0" encoding="utf-8" ?> @H_502_0@ <Search> @H_502_0@ <item id="8" name="百度网页"> @H_502_0@ <url><![CDATA[http://www.baidu.com/s?]]></url> @H_502_0@ <reg><![CDATA[ie=gb2312&bs={*|key@word|*}&sr=&z=&cl=3&f=8&wd={*|key@word|*}
&ct =0]]></reg> @H_502_0@ <provide type="Baidu"> @H_502_0@ </provide> @H_502_0@ </item> @H_502_0@ <item id="9" name="谷歌网页"> @H_502_0@ <url><![CDATA[http://www.google.com/search?]]></url> @H_502_0@ <reg><![CDATA[hl=zh-CN&q={*|key@word|*}&btnG=Google+%E6%90%9C%E7%B4%A2&lr
=]]></reg> @H_502_0@ <provide type="Google"> @H_502_0@ </provide> @H_502_0@ </item> @H_502_0@ <item id="10" name="爱问网页"> @H_502_0@ <url><![CDATA[http://www.iask.com/s?]]></url> @H_502_0@ <reg><![CDATA[tag=n&k={*|key@word|*}]]></reg> @H_502_0@ <provide type="Iask"> @H_502_0@ </provide> @H_502_0@ </item> @H_502_0@ <item id="11" name="搜狗网页"> @H_502_0@ <url><![CDATA[http://www.sogou.com/web?]]></url> @H_502_0@ <reg><![CDATA[query={*|key@word|*}]]></reg> @H_502_0@ <provide type="Sogou"> @H_502_0@ </provide> @H_502_0@ </item> @H_502_0@ <item id="13" name="雅虎网页"> @H_502_0@ <url><![CDATA[http://search.cn.yahoo.com/search?]]></url> @H_502_0@ <reg><![CDATA[p={*|key@word|*}&ei=gb2312&source=ysearch_web_hp_button&z=
&Meta=]]></reg> @H_502_0@ <provide type="Yahoo"> @H_502_0@ </provide> @H_502_0@ </item> @H_502_0@ <item id="14" name="中搜网页"> @H_502_0@ <url><![CDATA[http://p.zhongsou.com/p?]]></url> @H_502_0@ <reg><![CDATA[w={*|key@word|*}&pt=1&k=&rt=o]]></reg> @H_502_0@ <provide type="Zhongsou"> @H_502_0@ </provide> @H_502_0@ </item> @H_502_0@ </Search> @H_502_0@ 1.5.4 搜索结果格式化文档Result.xsl
Result.xsl是搜索结果的格式化文件。经过搜索类的分析,所获得的搜索结果被转化成了XML数据。Result.xsl文件把这个XML文件格式化后输出给客户端显示。同时,本系统所附带的广告也写在了这个格式化文件中,广告也可以存储在数据库中。Result.xsl的详细代码如下:
@H_502_0@ <?xml version="1.0" encoding="utf-8"?> @H_502_0@ <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> @H_502_0@ <xsl:template match="/"> @H_502_0@ <xsl:text disable-output-escaping="yes"><![CDATA[<!DOCTYPE html PUBLIC "-//W3C //DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1- transitional. dtd">]]></xsl:text> @H_502_0@ <html> @H_502_0@ <head> @H_502_0@ <xsl:text disable-output-escaping="yes"> @H_502_0@ <![CDATA[ @H_502_0@ <script type="text/javascript" src="xmlhttp.js"></script> @H_502_0@ ]]> @H_502_0@ </xsl:text> @H_502_0@ <xsl:text disable-output-escaping="yes"> @H_502_0@ <![CDATA[ @H_502_0@ <style type='text/css'> @H_502_0@ img @H_502_0@ { @H_502_0@ border:0px; @H_502_0@ } @H_502_0@ body{font-size:12px;margin-left:20px;widht:95%;} @H_502_0@ .bodyinner{widht:95%;margin-left:20px;} @H_502_0@ .text-left{float:left; width:65%} @H_502_0@ .text-right{float:right;margin-right:20px;; width:15%} @H_502_0@ </style> @H_502_0@ ]]> @H_502_0@ </xsl:text> @H_502_0@ <xsl:value-of select="search/head" disable-output-escaping="yes"/> @H_502_0@ </head> @H_502_0@ <body > @H_502_0@ <div class="bodyinner"> @H_502_0@ <xsl:choose> @H_502_0@ <xsl:when test="search/body"> @H_502_0@ <xsl:apply-templates select="search/body"/> @H_502_0@ </xsl:when> @H_502_0@ <xsl:otherwise> @H_502_0@ <div> @H_502_0@ <xsl:text>对不起!没有你要查找的内容!</xsl:text> @H_502_0@ </div> @H_502_0@ </xsl:otherwise> @H_502_0@ </xsl:choose> @H_502_0@ <div class="text-right"> @H_502_0@ <br/> @H_502_0@ <a href="http://www.qucha.net" target="_blank"> 趣查网---精神休闲家园,让
查询成为乐趣!</a> @H_502_0@ <br/><br/> @H_502_0@ </div> @H_502_0@ </div> @H_502_0@ </body> @H_502_0@ </html> @H_502_0@ </xsl:template> @H_502_0@ <xsl:template match="search/body"> @H_502_0@ <div class="text-left"> @H_502_0@ <xsl:apply-templates select="item"/> @H_502_0@ <xsl:value-of select="pageSite" disable-output-escaping="yes"/> @H_502_0@ </div> @H_502_0@ </xsl:template> @H_502_0@ <xsl:template match="item"> @H_502_0@ <xsl:value-of select="begin" disable-output-escaping="yes"/> @H_502_0@ <xsl:apply-templates select="sour"/> @H_502_0@ <xsl:value-of select="end" disable-output-escaping="yes"/> @H_502_0@ <br/> @H_502_0@ </xsl:template> @H_502_0@ <xsl:template match="sour"> @H_502_0@ <div> @H_502_0@ <xsl:value-of select="." disable-output-escaping="yes"/> @H_502_0@ <xsl:if test="position()=1"> @H_502_0@ <xsl:text> </xsl:text> @H_502_0@ </xsl:if> @H_502_0@ </div> @H_502_0@ </xsl:template> @H_502_0@ </xsl:stylesheet> @H_502_0@ 1.5.5 查询页面S.ashx
S.ashx是真正执行查询页面文件。它负责读取配置文件Search.xml中的数据,为查询准备好参数,并把参数传递给指定搜索引擎专用类。搜索引擎专用类执行Search()方法,把搜索引擎返回的结果以result.xsl的格式输出给客户端显示。具体代码如下:
@H_502_0@ <%@ WebHandler Language="C#" Class="S" %> @H_502_0@ using System; @H_502_0@ using System.Collections.Generic; @H_502_0@ using System.Text; @H_502_0@ using System.Web; @H_502_0@ using System.Xml; @H_502_0@ using System.Web.Caching; @H_502_0@ public class S : IHttpHandler @H_502_0@ { @H_502_0@ //获取配置文件中某个搜索引擎的相关数据 @H_502_0@ public XmlNode getSearchContent(string id) @H_502_0@ { @H_502_0@ Object config = HttpContext.Current.Cache["search"]; @H_502_0@ XmlDocument doc = config as XmlDocument; @H_502_0@ if (doc == null) @H_502_0@ { @H_502_0@ //搜索引擎配置文件的路径 @H_502_0@ string path = HttpContext.Current.Server.MapPath(Tools.getApplica
tionPath() + "Search.xml"); @H_502_0@ doc = new XmlDocument(); @H_502_0@ doc.Load(path); //装载文件 @H_502_0@ config = doc; @H_502_0@ //配置文件装入cache中,方便以后调用 @H_502_0@ HttpContext.Current.Cache.Insert("search",config,new System.Web.
Caching.CacheDependency(path),DateTime.MaxValue,TimeSpan.Zero,
CacheItemPriority. AboveNormal,null); @H_502_0@ } @H_502_0@ return doc.DocumentElement.SelectSingleNode(string.Format("item[@id=
'{0}']",id)); @H_502_0@ } @H_502_0@ public void ProcessRequest(HttpContext context) @H_502_0@ { @H_502_0@ XmlDocument document = null; @H_502_0@ string id = Tools.getPostItem("no"); //选定的搜索引擎编号 @H_502_0@ string key = Tools.getPostItem("key"); //搜索关键字 @H_502_0@ string style = "result.xsl"; //搜索结果显示样式 @H_502_0@ if (id == "") //id不存在 @H_502_0@ { @H_502_0@ id = Tools.getPostItem("itemtype"); @H_502_0@ if (id == "") @H_502_0@ { @H_502_0@ id = "9"; @H_502_0@ } @H_502_0@ } @H_502_0@ if (id == "") @H_502_0@ { @H_502_0@ } @H_502_0@ else //id存在 @H_502_0@ { @H_502_0@ XmlNode config = getSearchContent(id); //搜索引擎的相关信息 @H_502_0@ if (config != null) @H_502_0@ { @H_502_0@ string url = config.SelectSingleNode("url").InnerText; @H_502_0@ //搜索引擎的url @H_502_0@ string reg = config.SelectSingleNode("reg").InnerText; @H_502_0@ //与之相关的查询字符串的正则表达式 @H_502_0@ if (config.Attributes["style"] != null && config.Attributes
["style"].Value != "") @H_502_0@ { @H_502_0@ style = config.Attributes["style"].Value; @H_502_0@ //如果指定了特定的样式,则应用 @H_502_0@ } @H_502_0@ XmlNode provide = config.SelectSingleNode("provide"); @H_502_0@ //搜索执行需要的类 @H_502_0@ if (provide != null) //初始化合适的搜索类 @H_502_0@ { @H_502_0@ ISearch search = null; @H_502_0@ string type = provide.Attributes["type"].InnerText; @H_502_0@ //类名 @H_502_0@ switch (type) @H_502_0@ { @H_502_0@ case "Google": search = new Google(); break; @H_502_0@ case "Baidu": search = new Baidu(); break; @H_502_0@ case "Iask": search = new Iask(); break; @H_502_0@ case "Sogou": search = new Sogou(); break; @H_502_0@ case "Yahoo": search = new Yahoo(); break; @H_502_0@ case "Zhongsou": search = new Zhongsou(); break; @H_502_0@ default: search = new Baidu(); break; @H_502_0@ } @H_502_0@ if (search != null) @H_502_0@ { @H_502_0@ if (key == "") //没有搜索关键字,再取一次 @H_502_0@ { @H_502_0@ string get_url = SearchQuery.get_Nav().To
String(); @H_502_0@ //匹配 @H_502_0@ get_url = Tools.Replace(get_url,"(no)|(key)
[^&#]+",""); @H_502_0@ search.URL = url + get_url; //路径 @H_502_0@ } @H_502_0@ else @H_502_0@ { @H_502_0@ search.URL = url + reg.Replace("{*|key@ word|*}",
key); @H_502_0@ } @H_502_0@ if (provide.Attributes["en"] != null)//编码方式 @H_502_0@ { @H_502_0@ search.EnCode = provide.Attributes["en"].
Value; @H_502_0@ } @H_502_0@ search.ItemType = id; @H_502_0@ document = search.Search(); //搜索得到结果 @H_502_0@ } @H_502_0@ } @H_502_0@ else //为空,重新搜索 @H_502_0@ { @H_502_0@ string desculr = url + reg.Replace("{*|key@word|*}",Http
Context.Current.Server.UrlEncode(key)); @H_502_0@ context.Response.Redirect(desculr,true); @H_502_0@ return; @H_502_0@ } @H_502_0@ } @H_502_0@ else @H_502_0@ { @H_502_0@ document = new XmlDocument(); @H_502_0@ document.LoadXml("<search/>"); //空文档 @H_502_0@ } @H_502_0@ } @H_502_0@ if (document != null) @H_502_0@ { @H_502_0@ string xmlstr = Tools.XmlToString(document,style); @H_502_0@ //把xml转换成字符串 @H_502_0@ context.Response.ContentType = "text/html"; @H_502_0@ context.Response.Write(xmlstr); //输出内容 @H_502_0@ context.Response.End(); @H_502_0@ } @H_502_0@ } @H_502_0@ public bool IsReusable //不重用 @H_502_0@ { @H_502_0@ get @H_502_0@ { @H_502_0@ return false; @H_502_0@ } @H_502_0@ } @H_502_0@ } @H_502_0@ 1.6 小结
本文详述了一个聚合搜索引擎的实现过程。是一个相当实用的项目,通过应用此示例可以大大提高搜索的效率和准确度。本系统只考虑了聚合搜索技术实现方面的问题,对此而引起的任何法律问题未做考虑,所以如果把本例用做商业用途,请谨慎为之。

猜你在找的设计模式相关文章