Lucene.net站内寻找—四、找寻引擎第一版本事储备(简介Log肆Net、生产者消费者格局)美学原理

目录

Lucene.net站内寻觅—一、SEO优化
Lucene.net站内搜索—二、Lucene.Net简要介绍和分词
Lucene.net站内寻找—三、最简便寻觅引擎代码
Lucene.net站内寻觅—四、寻找引擎第三版手艺储备(简要介绍Log四Net、生产者消费者方式)
Lucene.net站内寻找—5、寻找引擎第三版完结
Lucene.net站内搜索—陆、站内搜索第3版

大家先来看下百度查寻

美学原理 1

用户保存1篇作品就把稿子写入索引库

用户输入“笔者爱好的时令”也得以搜寻出含有“喜欢的”和“季节”的,那里运用了分词。query.Add(new
Term(“body’,str))

招来结果页面突显标题和帖子的一片段(帖子的前九拾几个字)。点击标题能够进来帖子页面。作者那边结果页面权且不用分页。

英文寻觅时要改变为小写的,因为真主分词会暗许把英文转化为题写保存。

面试也许会问的标题:Lucene.Net的法则:分词、B+树、索引。

若果找寻结果为空,看看是否开创索引download下来的是乱码,因为壹旦download的是乱码,当然搜索不到

来得用Repeater,将追寻结果放到

 public class SearchResultInfo
    {
        public string URL{get;set;}
        public String Title { get; set; }
        public String Summary { get; set; }
    }
List< SearchResultInfo> list = new List< SearchResultInfo>();
repeater.DataSource=list;

把list绑定到Repeater,不思虑分页,设置一下Repeater的ItemTempelete

 <asp:Repeater ID=”Repeater1″ runat=”server”>

        <ItemTemplate><a href=”Eval(‘URL’)”
/></ItemTemplate>

    </asp:Repeater>

对象中,然后绑定到ListView中,其实用Repeater也足以

 <asp:ListView ID="listResult" runat="server">
        <ItemTemplate>
            <p>
                <a href="<%#Eval("URL") %>"><%#Eval("Title") %></a></p>
            <p>
                <%#Eval("Summary")%></p>
        </ItemTemplate>
        <LayoutTemplate>
            <asp:PlaceHolder ID="itemPlaceholder" runat="server" />
        </LayoutTemplate>
        <EmptyDataTemplate>
            <p>
                No Result</p>
        </EmptyDataTemplate>
    </asp:ListView>

Log4Net

此处本身大致介绍下Log4Net,因为背后用获得。

   
Log④Net是用来记录日志的,能够将程序运转进程中的新闻输出到部分位置(文件、数据库、伊芙ntLog等),日志便是先后的黑匣子,能够透过日记查看系统的运作进度,从而发现系统的难题。日志的效应:将运维进度的手续、成功失利记录下来,将重点的多少记录下来分析系统难题所在。Log肆J。

   
对于网址来讲,不可能把格外信息浮现给用户,相当消息只好记录到日志,出了难题把日志文件发松开荒职员,就能知晓难题所在。

Log4net的安装:

用户能够从http://logging.apache.org/log4net/下载log4net的源代码。解压软件包后,在解压的src目录下将log四net.sln载入Visual
Studio
.NET,编译后能够收获log四net.dll。用户要在友好的次第里进入日志效用,只需将log四net.dll引进工程就能够。

配置Log4Net环境

  • 新建三个WebApplication
  • 添加对log4net.dll的引用(bin\net\2.0\release)
  • 在Web.Config (或App.Config)加多配置,见备注
  • 早先化:在先后最起初投入log四net.Config.XmlConfigurator.Configure();不要加到页面包车型地铁Load
  • 在要打印日志的地点LogManager.GetLogger(typeof(Program)).Debug(“新闻”);
    。通过LogManager.GetLogger传递要记录的日志类类名得到那个类的ILog(这样在日记文件中就能观察那条日志是哪位类输出的了),然后调用Debug方法输出新闻。因为2个类内部不止1个地点要打字与印刷日志,所以1般把ILog评释为3个static字段。
  • 出口错误新闻用ILog.Error方法,第二个参数能够传递Exception对象。log.Error(“***错误”+ex),log.Error(“***错误”,ex)
  • 测试代码:见上边。

    log("准备执行数据库清理"+DateTime.Now);
    try
    {
    clear();
    log("清理成功"+DateTime.Now);
    }
    catch(Excepion ex)
    {
    log("清理失败"+DateTime.Now+ex);
    }
    

    在VS20第10中学的调节台项目引用Log4Net的时候要将品种的“指标框架”改为非“Client
    Profile”

    ### 备注:

    1、Log4Net配置

    <configuration>
      <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
      </configSections>
      <log4net>
        <!-- Define some output appenders -->
        <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
          <file value="test.txt"/>
          <appendToFile value="true"/>
          <maxSizeRollBackups value="10"/>
          <maximumFileSize value="1024KB"/>
          <rollingStyle value="Size"/>
          <staticLogFileName value="true"/>
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
          </layout>
        </appender>
        <root>
          <level value="DEBUG"/>
          <appender-ref ref="RollingLogFileAppender"/>
        </root>
      </log4net>
    </configuration>
    

    2、完整示例

     class Program
        {
            private static ILog log = LogManager.GetLogger(typeof(Program));
            static void Main(string[] args)
            {
                log4net.Config.XmlConfigurator.Configure();
                log.Debug("开始运行");
                string s = Console.ReadLine();
                log.Debug("用户输入:"+s);
                try
                {
                    int i = Convert.ToInt32(s);
                }
                catch (Exception ex)
                {
                    log.Error("用户输入的数据错误:" + s, ex);
                }
                Console.ReadKey();
                log.Debug("程序退出");
            }
    

    生产者消费者情势

  • 劳动者、消费者格局:生产者、消费者不要相互等待,用饭店做缓冲。轻易原理性代码见备注

  • 举例:二十102线程操作同多个文件时会现身并发难题。消除的二个艺术就是给文件加锁(lock),但是那样的话,贰个线程操作文件时,其余的都得等待,那样的话质量万分差。别的3个化解方案,正是先将数据放在队列中,然后展开一个线程,负责从队列中收取数据,再写到文件中。

  • 因为与此同时只好有3个线程对索引库进行写操作,所以以壹种政策(联想火车中等厕所可用,红灯/绿灯正是评释是不是有人在用)是一直检测是还是不是厕所可用,带来的主题材料就是作用低;其余壹种政策就是信托给列车员排队处理,那样就可以去干其他。

  • 队列(先入先出):Queue、ConcurrentQueue(*线程安全,四线程中用这一个)。栈(*):Stack:先进后出。

  • 发邮件、发短信偶尔会境遇半个钟头才接受的情景正是在排队处理。

    Demo:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    namespace 生产者消费者模式
    {
        class Program
        {
            //仓库
            static List<int> list = new List<int>();
            static void Main(string[] args)
            {
                //while (true)
                //{
                //    Console.WriteLine("请输入一个数字");
                //    int i = Convert.ToInt32(Console.ReadLine());
                //    耗时操作.Process(i);
                //}
                //消费线程
                Thread thread = new Thread(ThreadRun);
                thread.Start();
                //生产线程
                while (true)
                {
                    Console.WriteLine("请输入一个数字");
                    int i = Convert.ToInt32(Console.ReadLine());
                    list.Add(i);//把任务放入仓库
                }
            }
            static void ThreadRun()
            {
                while (true)
                {
                    //如果仓库中有产品,就消费
                    if (list.Count > 0)
                    {
                        int i = list[0];//有线程安全问题
                        list.RemoveAt(0);//消费完毕后从仓库移除
                        Thread.Sleep(5000);//模拟耗时操作.Process(i);
                    }
                }
            }
        }
    }