加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 程序设计 > 正文

聚合搜索(三)

发布时间:2020-05-23 02:27:10 所属栏目:程序设计 来源:互联网
导读:1.3 SearchQuery类和Isearch类 SearchQuery和Isearch是和专用搜索类密切相关的两个基础类。其中Isearch是专用搜索类的基类,SearchQuery是给专用搜索类传递参数的工具类。下面逐一对它们进行介绍。 1.3.1 搜索字符处理类SearchQuery 本系统中查询字符串的参数

1.3 SearchQuery类和Isearch类 SearchQuery和Isearch是和专用搜索类密切相关的两个基础类。其中Isearch是专用搜索类的基类,SearchQuery是给专用搜索类传递参数的工具类。下面逐一对它们进行介绍。 1.3.1 搜索字符处理类SearchQuery 本系统中查询字符串的参数传递意义重大。客户端页面需要向服务器传递参数,如查询的关键字、使用的搜索引擎等;服务器同时也要向搜索引擎提交查询参数,以获取查询结果。本章中以“nav_go_post”为名存储与搜索引擎相关的参数,这个参数值采用Base64编码形式。SearchQuery就是主要用来处理“nav_go_post”查询变量的类。“nav_go_post”变量是一个“键值对”的形式,是参数传递的中介体。SearchQuery类的具体代码如下。 //SearchQuery类的代码 using System; using System.Collections; using System.Collections.Generic; using System.Text; using System.Data; using System.Text.RegularExpressions; using System.Xml; using System.Xml.XPath; using System.Web; using System.Xml.Xsl; using System.IO; //聚合搜索查询字符串的处理类 public class SearchQuery { Dictionary<string,string> list = new Dictionary<string,string>(); //查询字符串的名值对的集合 public SearchQuery() { //搜索的特定查询字符串 string post = HttpContext.Current.Server.UrlDecode(HttpContext.Current.
Request["nav_go_post"]); if (post != null) //分析这个字符串,添加到名值对集合中 { post = post.Replace(" ","+"); string list_ = Tools.Base64To(post); string[] zs = list_.Split('&'); string name = ""; //定义名变量 string value = ""; //定义值变量 foreach (string str in zs) //遍历添加数据 { name = Regex.Match(str,"[^=]+",RegexOptions.IgnoreCase).Value; value = Regex.Match(str,"(?<==).+",RegexOptions.IgnoreCase).Value; list[name] = value; } } } //把名值对集合转换成base64编码的字符串 public string GetBase64() { IEnumerator<string> ie = list.Keys.GetEnumerator(); List<string> ls = new List<string>(); while (ie.MoveNext()) //遍历添加数据 { string key = ie.Current; string value = list[key]; ls.Add(string.Format("{0}={1}",key,value)); } if (ls.Count > 0) //把名值对集合转换成base64编码的字符串 { return Tools.ToBase64(string.Join("&",ls.ToArray())); } return ""; } //获取指定名字的键值 public string this[string name] { get { if (name != null && name != "") { return list[name]; } return null; } } // 添加一个名值对 public void Add(string name,string value) { if (!list.ContainsKey(name)) //不包含键值,则添加 { list.Add(name,value); } Else //修改 { list[name] = value; } } //重写,将名值对集合转换成查询字符串形式 public override string ToString() { IEnumerator<string> ie = list.Keys.GetEnumerator(); List<string> ls = new List<string>(); while (ie.MoveNext()) //遍历名值对 { string key = ie.Current; string value = list[key]; ls.Add(string.Format("{0}={1}",value)); } return string.Join("&",ls.ToArray()); } //获得一个本类 public static SearchQuery get_Nav() { return new SearchQuery(); } } 1.3.2 搜索基类Isearch Isearch类是搜索专用类的基类。它定义了一个虚拟方法Search(),用来执行具体的搜索任务。各搜索专用类只需重写这个方法,实现自己的搜索逻辑即可。Isearch类的一个重要方法是GetPageString(),它用来获取搜索结果。其代码如下: using System; using System.Data; using System.Configuration; using System.Web; using System.Net; using System.IO; using System.Text; using System.Collections.Generic; public abstract class ISearch { string m_Url = ""; //搜索的url(包含查询参数) public string URL { get { return m_Url; } set { m_Url = value; } } string m_itemtype; //搜索引擎的id,如google为9 public string ItemType { get { return m_itemtype; } set { m_itemtype = value; } } string en = ""; public string EnCode //编码方式 { get { return en; } set { en = value; } } protected string GetPageString() //获取搜索结果的字符串表示 { if (m_Url == null || m_Url == "" || !Tools.RegEx(@"^(/w+):////[^/.]+
[/.]/w+",m_Url)) { return ""; } string xmlstr = ""; if (EnCode != "") { //指定编码方式获取 xmlstr = Thief(m_Url,System.Text.Encoding.GetEncoding(en)); } else { xmlstr = Thief(m_Url); //默认编码方式获取 } xmlstr = Tools.Replace(xmlstr,"[/x00-/x08]|[/x0B-/x0C]|[/x0E-/x1F]",""); xmlstr = Tools.delTagArray(xmlstr,"meta,title",true); //删除meta、title return xmlstr; } //以指定编码方式获取某个页面内容 private string Thief(string url,Encoding enc) { string tempurl = UrlEncode(url,enc); //对url进行编码 HttpWebRequest webr = (HttpWebRequest)WebRequest.Create(tempurl); //创建请求 HttpWebResponse wb = (HttpWebResponse)webr.GetResponse(); Stream sr = wb.GetResponseStream(); //得到返回数据流 StreamReader sr1 = new StreamReader(sr,enc);//用于读取数据流的内容 string zz = sr1.ReadToEnd(); //读取完成 sr1.Close(); wb.Close(); //关闭 return zz; } //对url进行编码;url:请求的路径;enc:编码格式 private static string UrlEncode(string url,Encoding enc) { byte[] bs = enc.GetBytes(url); //得到字节表示的数组 StringBuilder sb = new StringBuilder(); //用于返回结果 for (int i = 0; i < bs.Length; i++) { if (bs[i] < 128) //asc码在128以下,直接添加 sb.Append((char)bs[i]); else { //以格式化好的样式添加 sb.Append("%" + bs[i++].ToString("x").PadLeft(2,'0')); sb.Append("%" + bs[i].ToString("x").PadLeft(2,'0')); } } return sb.ToString(); } //获取某个页面。以返回流的编码方式,接收返回的信息 private string Thief(string url) { string tempurl = UrlEncode(url,System.Text.Encoding.GetEncoding
("gb2312"));//url HttpWebRequest webr = (HttpWebRequest)WebRequest.Create(tempurl); //创建请求 HttpWebResponse wb = (HttpWebResponse)webr.GetResponse(); Stream sr = wb.GetResponseStream(); //得到返回数据流 Encoding encode; switch (wb.CharacterSet.ToLower()) //返回数据流的编码方式 { case "utf-8": encode = System.Text.Encoding.GetEncoding("utf-8"); break; case "gb2312": encode = System.Text.Encoding.GetEncoding("gb2312"); break; default: encode = System.Text.Encoding.GetEncoding("gb2312"); //默认为中文 break; } StreamReader sr1 = new StreamReader(sr,encode); string zz = sr1.ReadToEnd(); //读取完成 sr1.Close(); wb.Close();//关闭 return zz; } //搜索的虚拟方法,由专用类重写,实现自己特定的搜索任务。 public abstract System.Xml.XmlDocument Search(); }

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读