加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

一步步开发自己的博客 .NET版(5、Lucenne.Net 和 必应站内搜索

发布时间:2020-12-15 21:24:46 所属栏目:asp.Net 来源:网络整理
导读:前言? ? ? 这次开发的博客主要功能或特点:? ? 第一:可以兼容各终端,特别是手机端。? ? 第二:到时会用到大量html5,炫

前言?

? ? 这次开发的博客主要功能或特点:? ? 第一:可以兼容各终端,特别是手机端。? ? 第二:到时会用到大量html5,炫啊。? ? 第三:导入博客园的精华文章,并做分类。(不要封我)? ? 第四:做个插件,任何网站上的技术文章都可以转发收藏 到本博客。

所以打算写个系类:《》

? ?

<div style="float: left;">

<img src="https://www.52php.cn/res/2019/02-07/23/267496959bf8710b22bd733c414b5277.jpg" alt="">

今天来分析下 中的搜索功能。搜索功能在个人网站里面要有这么个东西,但又不是特别重要。所以我们需要有,可以不用太深入了解,毕竟我们不是专门做搜索这块的。

所以,我打算把搜索分两块。一块是,用Lucene.Net实现站内搜索。一块是利用第三方搜索引擎来 实现站内搜索。

<div style="float: left;">?

Lucene.Net简介

Lucene帮助类

IndexWriter writer = IndexWriter(directory_luce,analyzer,=

这里的?

directory_luce 是索引创建路径

analyzer?分析器

value 是对应 存入索引额名字和值

2.从索引里面搜索? ? ? ?

[] fileds = { , }; QueryParser parser = = MultiFieldQueryParser(version,fileds,analyzer); Query query = n = = IndexSearcher(directory_luce,); TopDocs docs = searcher.Search(query,(Filter) (docs == || docs.TotalHits == list = List counter = (ScoreDoc sd docs.ScoreDocs) = id = .Parse(doc.Get( title = doc.Get( content = doc.Get( blogTag = doc.Get( url = doc.Get( flag = .Parse(doc.Get( clickQuantity = .Parse(doc.Get( </span><span style="color: #0000ff;"&gt;string</span> createdate = doc.Get(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;createdate</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;); PanGu.HighLight.SimpleHTMLFormatter simpleHTMLFormatter </span>= <span style="color: #0000ff;"&gt;new</span> PanGu.HighLight.SimpleHTMLFormatter(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;<font color="red"&gt;</span><span style="color: #800000;"&gt;"</span>,<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;</font></span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;); PanGu.HighLight.Highlighter highlighter </span>= <span style="color: #0000ff;"&gt;new</span> PanGu.HighLight.Highlighter(simpleHTMLFormatter,<span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; PanGu.Segment()); highlighter.FragmentSize </span>= <span style="color: #800080;"&gt;50</span><span style="color: #000000;"&gt;; content </span>=<span style="color: #000000;"&gt; highlighter.GetBestFragment(keyword,content); </span><span style="color: #0000ff;"&gt;string</span> titlehighlight =<span style="color: #000000;"&gt; highlighter.GetBestFragment(keyword,title); </span><span style="color: #0000ff;"&gt;if</span> (titlehighlight != <span style="color: #800000;"&gt;""</span>) title =<span style="color: #000000;"&gt; titlehighlight; list.Add(</span><span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; SearchResult(title,content,url,blogTag,id,clickQuantity,flag)); } </span><span style="color: #0000ff;"&gt;catch</span><span style="color: #000000;"&gt; (Exception ex) { Console.WriteLine(ex.Message); } counter</span>++<span style="color: #000000;"&gt;; } </span><span style="color: #0000ff;"&gt;return</span> list;</pre>

3.完整代码

</span><span style="color: #0000ff;"&gt;#region</span> 单一实例 <span style="color: #0000ff;"&gt;private</span> <span style="color: #0000ff;"&gt;static</span> PanGuLuceneHelper _instance = <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;; </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span> <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 单一实例 </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span> <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span><span style="color: #000000;"&gt; PanGuLuceneHelper instance { </span><span style="color: #0000ff;"&gt;get</span><span style="color: #000000;"&gt; { </span><span style="color: #0000ff;"&gt;if</span> (_instance == <span style="color: #0000ff;"&gt;null</span>) _instance = <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; PanGuLuceneHelper(); </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; _instance; } } </span><span style="color: #0000ff;"&gt;#endregion</span> <span style="color: #0000ff;"&gt;#region</span> 00一些属性和参数 <span style="color: #0000ff;"&gt;#region</span> Lucene.Net的目录-参数 <span style="color: #0000ff;"&gt;private</span> Lucene.Net.Store.Directory _directory_luce = <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;; </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span> <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; Lucene.Net的目录-参数 </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span> <span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; Lucene.Net.Store.Directory directory_luce { </span><span style="color: #0000ff;"&gt;get</span><span style="color: #000000;"&gt; { </span><span style="color: #0000ff;"&gt;if</span> (_directory_luce == <span style="color: #0000ff;"&gt;null</span>) _directory_luce =<span style="color: #000000;"&gt; Lucene.Net.Store.FSDirectory.Open(directory); </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; _directory_luce; } } </span><span style="color: #0000ff;"&gt;#endregion</span> <span style="color: #0000ff;"&gt;#region</span> 索引在硬盘上的目录 <span style="color: #0000ff;"&gt;private</span> System.IO.DirectoryInfo _directory = <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;; </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span> <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 索引在硬盘上的目录 </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span> <span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; System.IO.DirectoryInfo directory { </span><span style="color: #0000ff;"&gt;get</span><span style="color: #000000;"&gt; { </span><span style="color: #0000ff;"&gt;if</span> (_directory == <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;) { </span><span style="color: #0000ff;"&gt;string</span> dirPath = AppDomain.CurrentDomain.BaseDirectory + <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;SearchIndex</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;; </span><span style="color: #0000ff;"&gt;if</span> (System.IO.Directory.Exists(dirPath) == <span style="color: #0000ff;"&gt;false</span>) _directory =<span style="color: #000000;"&gt; System.IO.Directory.CreateDirectory(dirPath); </span><span style="color: #0000ff;"&gt;else</span> _directory = <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; System.IO.DirectoryInfo(dirPath); } </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; _directory; } } </span><span style="color: #0000ff;"&gt;#endregion</span> <span style="color: #0000ff;"&gt;#region</span> 分析器 <span style="color: #0000ff;"&gt;private</span> Analyzer _analyzer = <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;; </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span> <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 分析器 </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span> <span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; Analyzer analyzer { </span><span style="color: #0000ff;"&gt;get</span><span style="color: #000000;"&gt; { { _analyzer </span>= <span style="color: #0000ff;"&gt;new</span> Lucene.Net.Analysis.PanGu.PanGuAnalyzer();<span style="color: #008000;"&gt;//</span>

<span style="color: #000000;"> }
<span style="color: #0000ff;">return<span style="color: #000000;"> _analyzer;
}
}
<span style="color: #0000ff;">#endregion

    <span style="color: #0000ff;"&gt;#region</span> 版本号枚举类
    <span style="color: #0000ff;"&gt;private</span> <span style="color: #0000ff;"&gt;static</span> Lucene.Net.Util.Version _version =<span style="color: #000000;"&gt; Lucene.Net.Util.Version.LUCENE_30;
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 版本号枚举类
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>
    <span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; Lucene.Net.Util.Version version
    {
        </span><span style="color: #0000ff;"&gt;get</span><span style="color: #000000;"&gt;
        {
            </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; _version;
        }
    }
    </span><span style="color: #0000ff;"&gt;#endregion</span>
    <span style="color: #0000ff;"&gt;#endregion</span>

    <span style="color: #0000ff;"&gt;#region</span> 01创建索引
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 创建索引(先删 后更新)
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<param name="datalist"&gt;</param></span>
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<returns></returns></span>
    <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;bool</span> CreateIndex(List<SearchResult><span style="color: #000000;"&gt; datalist)
    {
        IndexWriter writer </span>= <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;;
        </span><span style="color: #0000ff;"&gt;try</span><span style="color: #000000;"&gt;
        {
            writer </span>= <span style="color: #0000ff;"&gt;new</span> IndexWriter(directory_luce,<span style="color: #0000ff;"&gt;false</span>,IndexWriter.MaxFieldLength.LIMITED);<span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;false表示追加(true表示删除之前的重新写入)</span>

<span style="color: #000000;"> }
<span style="color: #0000ff;">catch<span style="color: #000000;">
{
writer = <span style="color: #0000ff;">new IndexWriter(directory_luce,<span style="color: #0000ff;">true,IndexWriter.MaxFieldLength.LIMITED);<span style="color: #008000;">//<span style="color: #008000;">false表示追加(true表示删除之前的重新写入)
<span style="color: #000000;"> }
<span style="color: #0000ff;">foreach (SearchResult data <span style="color: #0000ff;">in<span style="color: #000000;"> datalist)
{
writer.DeleteDocuments(<span style="color: #0000ff;">new Term(<span style="color: #800000;">"<span style="color: #800000;">id<span style="color: #800000;">",data.id.ToString()));<span style="color: #008000;">//<span style="color: #008000;">新增前 删除 不然会有重复数据
<span style="color: #000000;"> CreateIndex(writer,data);
}
writer.Optimize();
writer.Dispose();
<span style="color: #0000ff;">return <span style="color: #0000ff;">true<span style="color: #000000;">;
}
<span style="color: #0000ff;">public <span style="color: #0000ff;">bool<span style="color: #000000;"> CreateIndex(SearchResult data)
{
List datalist = <span style="color: #0000ff;">new List<span style="color: #000000;">();
datalist.Add(data);
<span style="color: #0000ff;">return<span style="color: #000000;"> CreateIndex(datalist);
}

    </span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;bool</span><span style="color: #000000;"&gt; CreateIndex(IndexWriter writer,SearchResult data)
    {
        </span><span style="color: #0000ff;"&gt;try</span><span style="color: #000000;"&gt;
        {

            </span><span style="color: #0000ff;"&gt;if</span> (data == <span style="color: #0000ff;"&gt;null</span>) <span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;false</span><span style="color: #000000;"&gt;;
            Document doc </span>= <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; Document();
            Type type </span>= data.GetType();<span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;assembly.GetType("Reflect_test.PurchaseOrderHeadManageModel",true,true); </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;命名空间名称 + 类名    

            </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;创建类的实例    
            </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;object obj = Activator.CreateInstance(type,true);  
            </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;获取公共属性    </span>
            PropertyInfo[] Propertys =<span style="color: #000000;"&gt; type.GetProperties();
            </span><span style="color: #0000ff;"&gt;for</span> (<span style="color: #0000ff;"&gt;int</span> i = <span style="color: #800080;"&gt;0</span>; i < Propertys.Length; i++<span style="color: #000000;"&gt;)
            {
                </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;Propertys[i].SetValue(Propertys[i],i,null); </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;设置值</span>
                PropertyInfo pi =<span style="color: #000000;"&gt; Propertys[i];
                </span><span style="color: #0000ff;"&gt;string</span> name =<span style="color: #000000;"&gt; pi.Name;
                </span><span style="color: #0000ff;"&gt;object</span> objval = pi.GetValue(data,<span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;);
                </span><span style="color: #0000ff;"&gt;string</span> value = objval == <span style="color: #0000ff;"&gt;null</span> ? <span style="color: #800000;"&gt;""</span> : objval.ToString(); <span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;值                   </span>
                <span style="color: #0000ff;"&gt;if</span> (name == <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;id</span><span style="color: #800000;"&gt;"</span> || name == <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;flag</span><span style="color: #800000;"&gt;"</span>)<span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;id在写入索引时必是不分词,否则是模糊搜索和删除,会出现混乱</span>

<span style="color: #000000;"> {
doc.Add(<span style="color: #0000ff;">new Field(name,Field.Index.NOT_ANALYZED));<span style="color: #008000;">//<span style="color: #008000;">id不分词
<span style="color: #000000;"> }
<span style="color: #0000ff;">else<span style="color: #000000;">
{
doc.Add(<span style="color: #0000ff;">new<span style="color: #000000;"> Field(name,Field.Index.ANALYZED));
}
}
writer.AddDocument(doc);
}
<span style="color: #0000ff;">catch<span style="color: #000000;"> (System.IO.FileNotFoundException fnfe)
{
<span style="color: #0000ff;">throw<span style="color: #000000;"> fnfe;
}
<span style="color: #0000ff;">return <span style="color: #0000ff;">true<span style="color: #000000;">;
}
<span style="color: #0000ff;">#endregion

    <span style="color: #0000ff;"&gt;#region</span> 02在title和content字段中查询数据
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 在title和content字段中查询数据
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<param name="keyword"&gt;</param></span>
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<returns></returns></span>
    <span style="color: #0000ff;"&gt;public</span> List<SearchResult> Search(<span style="color: #0000ff;"&gt;string</span><span style="color: #000000;"&gt; keyword)
    {
        </span><span style="color: #0000ff;"&gt;string</span>[] fileds = { <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;title</span><span style="color: #800000;"&gt;"</span>,flag));
                }
                </span><span style="color: #0000ff;"&gt;catch</span><span style="color: #000000;"&gt; (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                counter</span>++<span style="color: #000000;"&gt;;
            }
            </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; list;
        }
        </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;st.Stop();
        </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;Response.Write("查询时间:" + st.ElapsedMilliseconds + " 毫秒<br/>");</span>

<span style="color: #000000;">
}
<span style="color: #0000ff;">#endregion

    <span style="color: #0000ff;"&gt;#region</span> 03在不同的分类下再根据title和content字段中查询数据(分页)
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 在不同的类型下再根据title和content字段中查询数据(分页)
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<param name="_flag"&gt;</span><span style="color: #008000;"&gt;分类,传空值查询全部</span><span style="color: #808080;"&gt;</param></span>
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<param name="keyword"&gt;</param></span>
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<param name="PageIndex"&gt;</param></span>
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<param name="PageSize"&gt;</param></span>
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<param name="TotalCount"&gt;</param></span>
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<returns></returns></span>
    <span style="color: #0000ff;"&gt;public</span> List<SearchResult> Search(<span style="color: #0000ff;"&gt;string</span> _flag,<span style="color: #0000ff;"&gt;string</span> keyword,<span style="color: #0000ff;"&gt;int</span> PageIndex,<span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; PageSize)
    {
        </span><span style="color: #0000ff;"&gt;if</span> (PageIndex < <span style="color: #800080;"&gt;1</span>) PageIndex = <span style="color: #800080;"&gt;1</span><span style="color: #000000;"&gt;;
        Stopwatch st </span>=<span style="color: #000000;"&gt; Stopwatch.StartNew();
        st.Start();
        BooleanQuery bq </span>= <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; BooleanQuery();
        </span><span style="color: #0000ff;"&gt;if</span> (_flag != <span style="color: #800000;"&gt;""</span><span style="color: #000000;"&gt;)
        {
            QueryParser qpflag </span>= <span style="color: #0000ff;"&gt;new</span> QueryParser(version,<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;flag</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;,analyzer);
            Query qflag </span>=<span style="color: #000000;"&gt; qpflag.Parse(_flag);
            bq.Add(qflag,Occur.MUST);</span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;与运算</span>

<span style="color: #000000;"> }
<span style="color: #0000ff;">if (keyword != <span style="color: #800000;">""<span style="color: #000000;">)
{
<span style="color: #0000ff;">string[] fileds = { <span style="color: #800000;">"<span style="color: #800000;">blogTag<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">title<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">content<span style="color: #800000;">" };<span style="color: #008000;">//<span style="color: #008000;">查询字段
QueryParser parser = <span style="color: #0000ff;">null;<span style="color: #008000;">//<span style="color: #008000;"> new QueryParser(version,field,analyzer);<span style="color: #008000;">//<span style="color: #008000;">一个字段查询
parser = <span style="color: #0000ff;">new MultiFieldQueryParser(version,analyzer);<span style="color: #008000;">//<span style="color: #008000;">多个字段查询
Query queryKeyword =<span style="color: #000000;"> parser.Parse(keyword);
bq.Add(queryKeyword,Occur.MUST);<span style="color: #008000;">//<span style="color: #008000;">与运算
<span style="color: #000000;"> }

        TopScoreDocCollector collector </span>= TopScoreDocCollector.Create(PageIndex * PageSize,<span style="color: #0000ff;"&gt;false</span><span style="color: #000000;"&gt;);
        IndexSearcher searcher </span>= <span style="color: #0000ff;"&gt;new</span> IndexSearcher(directory_luce,<span style="color: #0000ff;"&gt;true</span>);<span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;true-表示只读</span>

<span style="color: #000000;"> searcher.Search(bq,collector);

        </span><span style="color: #0000ff;"&gt;if</span> (collector == <span style="color: #0000ff;"&gt;null</span> || collector.TotalHits == <span style="color: #800080;"&gt;0</span><span style="color: #000000;"&gt;)
        {
            </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;TotalCount = 0;</span>
            <span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;;
        }
        </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt;
        {
            </span><span style="color: #0000ff;"&gt;int</span> start = PageSize * (PageIndex - <span style="color: #800080;"&gt;1</span><span style="color: #000000;"&gt;);
            </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;结束数</span>
            <span style="color: #0000ff;"&gt;int</span> limit =<span style="color: #000000;"&gt; PageSize;
            ScoreDoc[] hits </span>=<span style="color: #000000;"&gt; collector.TopDocs(start,limit).ScoreDocs;
            List</span><SearchResult> list = <span style="color: #0000ff;"&gt;new</span> List<SearchResult><span style="color: #000000;"&gt;();
            </span><span style="color: #0000ff;"&gt;int</span> counter = <span style="color: #800080;"&gt;1</span><span style="color: #000000;"&gt;;
            </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;TotalCount = collector.TotalHits;</span>

<span style="color: #000000;"> st.Stop();
<span style="color: #008000;">//<span style="color: #008000;">st.ElapsedMilliseconds;<span style="color: #008000;">//<span style="color: #008000;">毫秒
<span style="color: #0000ff;">foreach (ScoreDoc sd <span style="color: #0000ff;">in hits)<span style="color: #008000;">//<span style="color: #008000;">遍历搜索到的结果
<span style="color: #000000;"> {
<span style="color: #0000ff;">try<span style="color: #000000;">
{
Document doc =<span style="color: #000000;"> searcher.Doc(sd.Doc);
<span style="color: #0000ff;">int id = <span style="color: #0000ff;">int.Parse(doc.Get(<span style="color: #800000;">"<span style="color: #800000;">id<span style="color: #800000;">"<span style="color: #000000;">));
<span style="color: #0000ff;">string title = doc.Get(<span style="color: #800000;">"<span style="color: #800000;">title<span style="color: #800000;">"<span style="color: #000000;">);
<span style="color: #0000ff;">string content = doc.Get(<span style="color: #800000;">"<span style="color: #800000;">content<span style="color: #800000;">"<span style="color: #000000;">);
<span style="color: #0000ff;">string blogTag = doc.Get(<span style="color: #800000;">"<span style="color: #800000;">blogTag<span style="color: #800000;">"<span style="color: #000000;">);
<span style="color: #0000ff;">string url = doc.Get(<span style="color: #800000;">"<span style="color: #800000;">url<span style="color: #800000;">"<span style="color: #000000;">);
<span style="color: #0000ff;">int flag = <span style="color: #0000ff;">int.Parse(doc.Get(<span style="color: #800000;">"<span style="color: #800000;">flag<span style="color: #800000;">"<span style="color: #000000;">));
<span style="color: #0000ff;">int clickQuantity = <span style="color: #0000ff;">int.Parse(doc.Get(<span style="color: #800000;">"<span style="color: #800000;">clickQuantity<span style="color: #800000;">"<span style="color: #000000;">));
content =<span style="color: #000000;"> Highlight(keyword,content);
<span style="color: #008000;">//<span style="color: #008000;">string titlehighlight = Highlight(keyword,title);
<span style="color: #008000;">//<span style="color: #008000;">if (titlehighlight != "") title = titlehighlight;
list.Add(<span style="color: #0000ff;">new<span style="color: #000000;"> SearchResult(title,flag));
}
<span style="color: #0000ff;">catch<span style="color: #000000;"> (Exception ex)
{
Console.WriteLine(ex.Message);
}
counter++<span style="color: #000000;">;
}
<span style="color: #0000ff;">return<span style="color: #000000;"> list;
}
}
<span style="color: #0000ff;">#endregion

    <span style="color: #0000ff;"&gt;#region</span> 把content按照keywords进行高亮
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 把content按照keywords进行高亮
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<param name="keywords"&gt;</param></span>
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<param name="content"&gt;</param></span>
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<returns></returns></span>
    <span style="color: #0000ff;"&gt;private</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;string</span> Highlight(<span style="color: #0000ff;"&gt;string</span> keywords,<span style="color: #0000ff;"&gt;string</span><span style="color: #000000;"&gt; content)
    {
        SimpleHTMLFormatter simpleHTMLFormatter </span>= <span style="color: #0000ff;"&gt;new</span> PanGu.HighLight.SimpleHTMLFormatter(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;<strong></span><span style="color: #800000;"&gt;"</span>,<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;</strong></span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;);
        Highlighter highlighter </span>= <span style="color: #0000ff;"&gt;new</span> PanGu.HighLight.Highlighter(simpleHTMLFormatter,<span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; Segment());
        highlighter.FragmentSize </span>= <span style="color: #800080;"&gt;200</span><span style="color: #000000;"&gt;;
        </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; highlighter.GetBestFragment(keywords,content);
    }
    </span><span style="color: #0000ff;"&gt;#endregion</span>

    <span style="color: #0000ff;"&gt;#region</span> 04删除索引
    <span style="color: #0000ff;"&gt;#region</span> 删除索引数据(根据id)
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 删除索引数据(根据id)
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<param name="id"&gt;</param></span>
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<returns></returns></span>
    <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;bool</span> Delete(<span style="color: #0000ff;"&gt;string</span><span style="color: #000000;"&gt; id)
    {
        </span><span style="color: #0000ff;"&gt;bool</span> IsSuccess = <span style="color: #0000ff;"&gt;false</span><span style="color: #000000;"&gt;;
        Term term </span>= <span style="color: #0000ff;"&gt;new</span> Term(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;id</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;,id);
        IndexWriter writer </span>= <span style="color: #0000ff;"&gt;new</span> IndexWriter(directory_luce,IndexWriter.MaxFieldLength.LIMITED);
        writer.DeleteDocuments(term); </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; writer.DeleteDocuments(term)或者writer.DeleteDocuments(query);            </span>

<span style="color: #000000;"> writer.Commit();
IsSuccess =<span style="color: #000000;"> writer.HasDeletions();
writer.Dispose();
<span style="color: #0000ff;">return<span style="color: #000000;"> IsSuccess;
}
<span style="color: #0000ff;">#endregion

    <span style="color: #0000ff;"&gt;#region</span> 删除全部索引数据
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 删除全部索引数据
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<returns></returns></span>
    <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;bool</span><span style="color: #000000;"&gt; DeleteAll()
    {
        </span><span style="color: #0000ff;"&gt;bool</span> IsSuccess = <span style="color: #0000ff;"&gt;true</span><span style="color: #000000;"&gt;;
        </span><span style="color: #0000ff;"&gt;try</span><span style="color: #000000;"&gt;
        {
            IndexWriter writer </span>= <span style="color: #0000ff;"&gt;new</span> IndexWriter(directory_luce,IndexWriter.MaxFieldLength.LIMITED);
            writer.DeleteAll();
            writer.Commit();
            IsSuccess </span>=<span style="color: #000000;"&gt; writer.HasDeletions();
            writer.Dispose();
        }
        </span><span style="color: #0000ff;"&gt;catch</span><span style="color: #000000;"&gt;
        {
            IsSuccess </span>= <span style="color: #0000ff;"&gt;false</span><span style="color: #000000;"&gt;;
        }
        </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; IsSuccess;
    }
    </span><span style="color: #0000ff;"&gt;#endregion</span>
    <span style="color: #0000ff;"&gt;#endregion</span>

    <span style="color: #0000ff;"&gt;#region</span> 分词测试
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 分词测试
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<param name="keyword"&gt;</param></span>
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<returns></returns></span>
    <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;string</span> Token(<span style="color: #0000ff;"&gt;string</span><span style="color: #000000;"&gt; keyword)
    {
        </span><span style="color: #0000ff;"&gt;string</span> ret = <span style="color: #800000;"&gt;""</span><span style="color: #000000;"&gt;;
        System.IO.StringReader reader </span>= <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; System.IO.StringReader(keyword);
        Lucene.Net.Analysis.TokenStream ts </span>=<span style="color: #000000;"&gt; analyzer.TokenStream(keyword,reader);
        </span><span style="color: #0000ff;"&gt;bool</span> hasNext =<span style="color: #000000;"&gt; ts.IncrementToken();
        Lucene.Net.Analysis.Tokenattributes.ITermAttribute ita;
        </span><span style="color: #0000ff;"&gt;while</span><span style="color: #000000;"&gt; (hasNext)
        {
            ita </span>= ts.GetAttribute<Lucene.Net.Analysis.Tokenattributes.ITermAttribute><span style="color: #000000;"&gt;();
            ret </span>+= ita.Term + <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;|</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;;
            hasNext </span>=<span style="color: #000000;"&gt; ts.IncrementToken();
        }
        ts.CloneAttributes();
        reader.Close();
        analyzer.Close();
        </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; ret;
    }
    </span><span style="color: #0000ff;"&gt;#endregion</span><span style="color: #000000;"&gt;

}</span></pre>
</span><span style="color: #0000ff;"&gt;public</span> SearchResult(<span style="color: #0000ff;"&gt;string</span> title,<span style="color: #0000ff;"&gt;string</span> content,<span style="color: #0000ff;"&gt;string</span> url,<span style="color: #0000ff;"&gt;string</span> blogTag,<span style="color: #0000ff;"&gt;int</span> id,<span style="color: #0000ff;"&gt;int</span> clickQuantity,<span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; flag) { </span><span style="color: #0000ff;"&gt;this</span>.blogTag =<span style="color: #000000;"&gt; blogTag; </span><span style="color: #0000ff;"&gt;this</span>.clickQuantity =<span style="color: #000000;"&gt; clickQuantity; </span><span style="color: #0000ff;"&gt;this</span>.content =<span style="color: #000000;"&gt; content; </span><span style="color: #0000ff;"&gt;this</span>.id =<span style="color: #000000;"&gt; id; </span><span style="color: #0000ff;"&gt;this</span>.url =<span style="color: #000000;"&gt; url; </span><span style="color: #0000ff;"&gt;this</span>.title =<span style="color: #000000;"&gt; title; </span><span style="color: #0000ff;"&gt;this</span>.flag =<span style="color: #000000;"&gt; flag; } </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span> <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 标题 </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span> <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;string</span> title { <span style="color: #0000ff;"&gt;get</span>; <span style="color: #0000ff;"&gt;set</span><span style="color: #000000;"&gt;; } </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span> <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 正文内容 </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span> <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;string</span> content { <span style="color: #0000ff;"&gt;get</span>; <span style="color: #0000ff;"&gt;set</span><span style="color: #000000;"&gt;; } </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span> <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; url地址 </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span> <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;string</span> url { <span style="color: #0000ff;"&gt;get</span>; <span style="color: #0000ff;"&gt;set</span><span style="color: #000000;"&gt;; } </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span> <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; tag标签 </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span> <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;string</span> blogTag { <span style="color: #0000ff;"&gt;get</span>; <span style="color: #0000ff;"&gt;set</span><span style="color: #000000;"&gt;; } </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span> <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 唯一id </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span> <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;int</span> id { <span style="color: #0000ff;"&gt;get</span>; <span style="color: #0000ff;"&gt;set</span><span style="color: #000000;"&gt;; } </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span> <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 点击量 </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span> <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;int</span> clickQuantity { <span style="color: #0000ff;"&gt;get</span>; <span style="color: #0000ff;"&gt;set</span><span style="color: #000000;"&gt;; } </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span> <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 标记(用户) </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span> <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;int</span> flag { <span style="color: #0000ff;"&gt;get</span>; <span style="color: #0000ff;"&gt;set</span><span style="color: #000000;"&gt;; } }</span></pre>

必应站内搜索

1.为什么要用必应搜索?

因为我们现在做的主要功能是博客系统,搜索只是其中的一小块环节。而 我对这搜索并不了解,所以就用第三方搜索,省事嘛。

2.为什么不用别的三方收索呢?

百度?不用说了,咱们程序员都懂的。谷歌?我倒是想用,可生在天朝,也是没得办法。选来选去 还是选了必应。

3.怎么来使用第三方的站内搜索?

格式如下:http://cn.bing.com/search?q=关键字+site:网站地址?

例如:?

效果图:

嘿嘿,如此之简单。既然都已经看到效果了,那么 我们可以干些什么呢??之前我一直是用??,现在为什么不用了,因为有了更好的。HtmlAgilityPack 缺点是 要去xpath,然 如果页面存在js动态改变文档结构的话,我们直接F12 复制出来的 xpath是不准的。那么有人 会说 ??我已经用习惯了,不想 重新学习Jumony 。这里我告诉你错了,根本就需要重新学习,如果你会jquery 的话。常用功能语法基本一样,还支持拉姆达表达式,爽的一逼。

我们来看看 怎么使用Jumony 解析 解锁结果吧。

document = list = document.Find().ToList().Select(t => t.ToString()).ToList();

两行代码搞定,还直接转成了list集合。在页面循环加载就ok了。

站内下的某个用户内搜索

?我个人觉得 这是个蛮实用的功能,我们有时候 写了博客(很多时候我们写博客就是把自己怕会忘记的知识点 整理记录),而后期找不到。那么通过这个功能 可以很好的解决我们的问题。我们不想全站搜索,只搜索自己的内容就可以了。

页面还是用全站的搜索页面,我们直接在搜索关键词上做手脚就可以了。比如,我们想搜索 ??用户下的内容,那么我们可以要搜索的关键字前面加上???? 那么完整的搜索关键字就成了???

?那么 ?我们要做的就是 在用户页面 搜索 就在关键字 前面加上??? 我们在搜索 页面解析的时候 需要做的就是 分解关键字?? 先用空格 分割 然后如果中间有 空格的话 ,然后判断 前面五个字符是不是??然后截取 到用户名和 关键字。

我们下面具体看看 在Lucene.net 和 必应搜索里面是怎么做的。

1.Lucene.net?

加载 Lucene.net 的搜索结果 (!Request.QueryString.AllKeys.Contains( key = Request.QueryString[ </span><span style="color: #0000ff;"&gt;var</span> zhankey = key.Split(<span style="color: #800000;"&gt;'</span> <span style="color: #800000;"&gt;'</span>);<span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;分割关键字</span> <span style="color: #0000ff;"&gt;var</span> blogName = <span style="color: #0000ff;"&gt;string</span><span style="color: #000000;"&gt;.Empty; </span><span style="color: #0000ff;"&gt;if</span> (zhankey.Length >= <span style="color: #800080;"&gt;2</span><span style="color: #000000;"&gt;) { </span><span style="color: #0000ff;"&gt;var</span> str = zhankey[<span style="color: #800080;"&gt;0</span><span style="color: #000000;"&gt;].Trim(); </span><span style="color: #0000ff;"&gt;if</span> (str.Length > <span style="color: #800080;"&gt;6</span> &amp;&amp; str.Substring(<span style="color: #800080;"&gt;0</span>,<span style="color: #800080;"&gt;5</span>) == <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;blog:</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;) blogName </span>= str.Substring(<span style="color: #800080;"&gt;5</span>);<span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;取得用户名</span>

<span style="color: #000000;"> }

        </span><span style="color: #0000ff;"&gt;string</span> userid = Request.QueryString.AllKeys.Contains(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;userid</span><span style="color: #800000;"&gt;"</span>) ? Request.QueryString[<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;userid</span><span style="color: #800000;"&gt;"</span>] : <span style="color: #800000;"&gt;""</span><span style="color: #000000;"&gt;;

        </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;这里判断是否 用户名不为空  然后取得用户对应的 用户ID  (因为 我在做Lucene 是用用户id 来标记的)</span>
        <span style="color: #0000ff;"&gt;if</span> (!<span style="color: #0000ff;"&gt;string</span><span style="color: #000000;"&gt;.IsNullOrEmpty(blogName))
        {
            key </span>= key.Substring(key.IndexOf(<span style="color: #800000;"&gt;'</span> <span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;));
            </span><span style="color: #0000ff;"&gt;var</span> userinfo = CacheData.GetAllUserInfo().Where(t => t.UserName ==<span style="color: #000000;"&gt; blogName).FirstOrDefault();
            </span><span style="color: #0000ff;"&gt;if</span> (<span style="color: #0000ff;"&gt;null</span> !=<span style="color: #000000;"&gt; userinfo)
                userid </span>=<span style="color: #000000;"&gt; userinfo.Id.ToString();
        }

        </span><span style="color: #0000ff;"&gt;string</span> pIndex = Request.QueryString.AllKeys.Contains(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;p</span><span style="color: #800000;"&gt;"</span>) ? Request.QueryString[<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;p</span><span style="color: #800000;"&gt;"</span>] : <span style="color: #800000;"&gt;""</span><span style="color: #000000;"&gt;;
        </span><span style="color: #0000ff;"&gt;int</span> PageIndex = <span style="color: #800080;"&gt;1</span><span style="color: #000000;"&gt;;
        </span><span style="color: #0000ff;"&gt;int</span>.TryParse(pIndex,<span style="color: #0000ff;"&gt;out</span><span style="color: #000000;"&gt; PageIndex);

        </span><span style="color: #0000ff;"&gt;int</span> PageSize = <span style="color: #800080;"&gt;10</span><span style="color: #000000;"&gt;;
        </span><span style="color: #0000ff;"&gt;var</span> searchlist =<span style="color: #000000;"&gt; PanGuLuceneHelper.instance.Search(userid,key,PageIndex,PageSize);
        </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; PartialView(searchlist);
    }
    </span><span style="color: #0000ff;"&gt;#endregion</span></pre>

?2.??必应搜索

加载 bing 的搜索结果 (!Request.QueryString.AllKeys.Contains( key = Request.QueryString[]; JumonyParser jumony = pIndex = Request.QueryString.AllKeys.Contains() ? Request.QueryString[] : PageIndex = .TryParse(pIndex,-- </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;如:blog:JeffreyZhao 博客</span> <span style="color: #0000ff;"&gt;var</span> zhankey = key.Split(<span style="color: #800000;"&gt;'</span> <span style="color: #800000;"&gt;'</span>);<span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;先用空格分割</span> <span style="color: #0000ff;"&gt;var</span> blogName = <span style="color: #0000ff;"&gt;string</span><span style="color: #000000;"&gt;.Empty; </span><span style="color: #0000ff;"&gt;if</span> (zhankey.Length >= <span style="color: #800080;"&gt;2</span><span style="color: #000000;"&gt;) { </span><span style="color: #0000ff;"&gt;var</span> str = zhankey[<span style="color: #800080;"&gt;0</span><span style="color: #000000;"&gt;].Trim(); </span><span style="color: #0000ff;"&gt;if</span> (str.Length > <span style="color: #800080;"&gt;6</span> &amp;&amp; str.Substring(<span style="color: #800080;"&gt;0</span>,<span style="color: #800080;"&gt;5</span>) == <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;blog:</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;) blogName </span>= <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;/</span><span style="color: #800000;"&gt;"</span> + str.Substring(<span style="color: #800080;"&gt;5</span>);<span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;这里取得 用户名</span>

<span style="color: #000000;"> }
<span style="color: #0000ff;">if (!<span style="color: #0000ff;">string<span style="color: #000000;">.IsNullOrEmpty(blogName))
key = key.Substring(key.IndexOf(<span style="color: #800000;">' <span style="color: #800000;">'<span style="color: #000000;">));

        </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;如:</span>
        <span style="color: #0000ff;"&gt;var</span> url = <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;http://cn.bing.com/search?q=</span><span style="color: #800000;"&gt;"</span> + key + <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;+site:</span><span style="color: #800000;"&gt;"</span> + siteUrl + blogName + <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;&amp;first=</span><span style="color: #800000;"&gt;"</span> + PageIndex + <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;1&amp;FORM=PERE</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;;
        </span><span style="color: #0000ff;"&gt;var</span> document =<span style="color: #000000;"&gt; jumony.LoadDocument(url);
        </span><span style="color: #0000ff;"&gt;var</span> list = document.Find(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;#b_results .b_algo</span><span style="color: #800000;"&gt;"</span>).ToList().Select(t =><span style="color: #000000;"&gt; t.ToString()).ToList();

        </span><span style="color: #0000ff;"&gt;var</span> listli = document.Find(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;li.b_pag nav ul li</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;);
        </span><span style="color: #0000ff;"&gt;if</span> (PageIndex > <span style="color: #800080;"&gt;0</span> &amp;&amp; listli.Count() == <span style="color: #800080;"&gt;0</span><span style="color: #000000;"&gt;)
            </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;;

        </span><span style="color: #0000ff;"&gt;if</span> (listli.Count() > <span style="color: #800080;"&gt;1</span><span style="color: #000000;"&gt;)
        {
            </span><span style="color: #0000ff;"&gt;var</span> text = document.Find(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;li.b_pag nav ul li</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;).Last().InnerText();
            </span><span style="color: #0000ff;"&gt;int</span> npage = -<span style="color: #800080;"&gt;1</span><span style="color: #000000;"&gt;;
            </span><span style="color: #0000ff;"&gt;if</span> (text == <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;下一页</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;)
            {
                </span><span style="color: #0000ff;"&gt;if</span> (listli.Count() > <span style="color: #800080;"&gt;1</span><span style="color: #000000;"&gt;)
                {
                    </span><span style="color: #0000ff;"&gt;var</span> num = listli.ToList()[listli.Count() - <span style="color: #800080;"&gt;2</span><span style="color: #000000;"&gt;].InnerText();
                    </span><span style="color: #0000ff;"&gt;int</span>.TryParse(num,<span style="color: #0000ff;"&gt;out</span><span style="color: #000000;"&gt; npage);
                }
            }
            </span><span style="color: #0000ff;"&gt;else</span>
                <span style="color: #0000ff;"&gt;int</span>.TryParse(text,<span style="color: #0000ff;"&gt;out</span><span style="color: #000000;"&gt; npage);
            </span><span style="color: #0000ff;"&gt;if</span> (npage <=<span style="color: #000000;"&gt; PageIndex)
                list </span>= <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;;
        }

        </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; PartialView(list);
    }
    </span><span style="color: #0000ff;"&gt;#endregion</span></pre>

?看看 我们的搜索结果的效果图吧。

总结

首先 搜索是必不可少的功能,但又不是主要功能。那么我们可以直接用lucene.net 来做搜索,然后用必应搜索做备用。但是 用必应 有个弊端。就是 ?如果我们 的文章页面 被用户自己删除了,而 必应已经收录了,那么 我们在搜索结果页面 点击 可能就是404 或 500 了。当然 我们自己的?lucene.net 也会有这个 问题,我们可以在用户删除 文章的时候 也删除 对应的那天搜索索引就好了。

演示地址:?

如果您对本篇文章感兴趣,那就麻烦您点个赞,您的鼓励将是我的动力。?当然您还可以加入QQ群:嗨 博客讨论。

如果您有更好的处理方式,希望不要吝啬赐教。

一步步开发自己的博客 .NET版系列:

本文链接:

(编辑:李大同)

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

    推荐文章
      热点阅读