聚合搜索(三)

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}", key, 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();
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值