日期:2014-05-17  浏览次数:20738 次

C#实现的知识搜索工具 - KBCruiser

平时通过搜索引擎去搜答案,总是觉得有些地方用起来不顺手,总结一下有这么几点

  1. 搜索引擎范围太宽,有的时候只想在官方文档和论坛里面找答案
  2. 并非所有的论坛内容和博客内容都被搜索引擎索引
  3. 点开的链接发现不是想要的内容,需要关掉当前窗口回到搜索页面继续找
  4. 点开链接没有关键字高亮

于是自己动手写了个知识搜索的客户端小工具,原理就是向不同的官方网站相应的搜索引擎发送请求,分析显示返回结果,同时在浏览器中实现关键字高亮。目前包含的功能主要有以下几点,

  1. 知识搜索
    • 论坛搜索 - Msdn, Asp.net, IIS.net, StackOverflow, Csdn
    • 博客搜索 - Msdn blog, AspNetBlog, IISBlog, Blogspot, WordPress, CsdnBlog
    • 知识库搜索 - Msdn library, Technet, MSKB, Wikipedia, RFC, W3C, IEEE, Ecma
    • 引擎搜索 - Bing, Google, Yahoo, Baidu
    • 代码搜索 - Code project, Sourceforge, Codeplex, Github
    • 下载搜索 - Ms download, Vs gallery, IIS Community, Softpedia, CNET
  2. 集成浏览器
  3. 相关查询
  4. 关键字高亮

安装包和代码下载放在了codeplex上,

https://kbcruiser.codeplex.com/


以下是效果图



实现中几个有趣的地方,

1. 下载网页通过不同网站对应的正则表达式把标题和相应链接抠出来,每个网站对应的表达式都放在一个叫Profiles.xml的配置文件中,例如msdn的

<SearcherConfig>
            <Default>true</Default>
            <Name>MSDNForum</Name>
            <ResultPageNumber>1</ResultPageNumber>
            <RequestTemplate>http://social.msdn.microsoft.com/Search/en-US/?query={0}&refinement=112&ac=8</RequestTemplate>
            <SearchTargetSeparator>%20</SearchTargetSeparator>
            <StartPageIndex>0</StartPageIndex>
            <DescriptionMatchPattern />
            <TitleStartIndex>9</TitleStartIndex>
            <UrlStartIndex>7</UrlStartIndex>
            <BaseUrl />
            <ReferenceMatchPattern>\{"title":[\s\S]*?"\}</ReferenceMatchPattern>
            <TitleMatchPattern>"title":"[\s\S]*?"</TitleMatchPattern>
            <UrlMatchPattern>"url":"[\s\S]*?"</UrlMatchPattern>
          </SearcherConfig>

2. 关键字高亮的实现也是通过正则表达式简单的替换一下显示style

if (triggerHighlight)
            {
                IHTMLDocument2 doc2 = wbContent.Document.DomDocument as IHTMLDocument2;
                string result = doc2.body.outerHTML;
                string substitution = null;
                string pattern = null;
                foreach (string key in keywords)
                {
                    pattern = string.Format(@"(>[^<]*?)(\b{0}\b)",key);
                    substitution = "$1<span style='background-color: rgb(255, 255, 0);'>$2</span>";
                    result = Regex.Replace(result, pattern, substitution, RegexOptions.IgnoreCase);
                }
                doc2.body.innerHTML = result;
                triggerHighlight = false;
            }

3. 搜索提示直接用google或bing的,但是这个功能不稳定,因为google或bing的搜索提示链接经常变化