zoukankan      html  css  js  c++  java
  • 【蛙蛙推荐】Lucene.net试用

    【简介】
      lucene.net好多人都知道的吧,反正我是最近才好好的看了一下,别笑我拿历史当新闻哦,不太了解Lucence的朋友先听我说两句哦。Lucene的知识主要分为索引、搜索、分析器、性能优化几个部分。索引和搜索没啥可说的,看几个例子就会了,来回那一套儿,按部就班做几个实验就熟悉了。分析器是Lucence的精华,又分为分词和过滤两部分,而且中文分词更是难点,我的例子里是用从博客园程序中提取出来的Lucene.Net.Analysis.Cn.dll来实现中文分词的,谁有中科院的那套中科院ICTCLAS分词工具的C#版麻烦提供一下哦。性能优化也很重要,因为如果要索引的文件比较大的话,建立索引的性能就会很大的下降,你可以调整IndexWriter的几个参数来优化索引性能,还有可以用IndexWriter.Optimize()方法(这个方法主要是优化查询速度,反而使索引性能有所下降),另外就是可以用多线程来分别对不同的内容进行索引并保存到RAMDirectory里,然后再把所有的内存索引合并到FSDirectory里,甚至可以让多台服务器分别处理内容的各个部分,然后把索引结果放到一个队列里,再有一台机器去读取索引结果队列并合并索引结果。
      做这个示例主要是为了演示一下Lucene.net的功能,它可以对你指定的目录里的.txt,.htm,.html文件进行全文索引,然后对其进行查询。由于如果要索引的目录里文件特别多特别大的话,建立索引需要花费很长的过程,所以我在示例程序里使用了异步编程,以便在建立索引的时候不阻塞界面线程。
    【内容】
    1、先看一个简单例子
    public void Test1()
    {
     //建立一个内存目录
     Lucene.Net.Store.RAMDirectory ramDir = new Lucene.Net.Store.RAMDirectory();

     //建立一个索引书写器
     IndexWriter ramWriter = new IndexWriter(ramDir,new ChineseAnalyzer(), true);

     //要索引的词,这就相当于一个个的要索引的文件
     string[] words = {"中华人民共和国", "人民共和国", "人民","共和国"}; 

     //循环数组,创建文档,给文档添加字段,并把文档添加到索引书写器里
     Document doc = null; 
     for (int i = 0; i < words.Length; i++)
     {
      doc = new Document();
      doc.Add(Field.Text("contents", words[i]));
      ramWriter.AddDocument(doc);
     }

     //索引优化
     ramWriter.Optimize();

     //关闭索引读写器,一定要关哦,按理说应该把上面的代码用try括主,在finally里关闭索引书写器
     ramWriter.Close();

     //构建一个索引搜索器
     IndexSearcher searcher = new IndexSearcher(ramDir);

     //用QueryParser.Parse方法实例化一个查询
     Query query = QueryParser.Parse("中华人民","contents",new ChineseAnalyzer());

     //获取搜索结果
     Hits hits = searcher.Search(query);

     //判断是否有搜索到的结果,当然你也可以遍历结果集并输出
     if (hits.Length() != 0)
      MessageBox.Show("有");
     else
      MessageBox.Show("没有");
    }
    2、其它的具体看下载代码吧。
      下载的文件里有个doc的文件夹,里面有4个文本文件,大家可以试着给那个目录建立索引,然后搜索一下“人民”,“中华”等几个关键字,看看能出来搜索结果吗?简单说一下示例程序,就是遍历一个目录,找出所有文本和网页的文件,建立Lucene的Document文件,并索引了文件的目录和内容,然后添加到索引器里,最后在程序执行目录的Index子目录里建立索引,这一部分的调用使用了异步委托。搜索的时候就是在Index目录里检索符合某个关键字的条目。
    【注意】
    1、建立完索引后一定要调用IndexWriter的Close方法,否则如果你要索引的目录里的文件少于minMergeDocs的话,是不能建立索引的。
    2、Field.Text的静态方法有两个重载版本,如果第二个参数是string的话那么这个字段既索引也存储,如果是TextReader的话只索引不存储,这点要搞清楚,另外在构建TextReader的时候要注意使用合适的编码格式,否则有的文件读出来是乱码,建立的索引肯定也是按乱码建立的咯。
    【小节】
      其实lucene大家谁也是学学就会,关键要是整一个像google,baidu这样的搜索引擎就难了,好歹这搜索引擎也是一个行业呢,所以谁有兴趣,好好钻研一下搜索行业的相关技术,没准靠这个还能创业呢,是吧。
      再问一下,《lucence实战》有中文版吗?或者其它关于Lucence的中午图书,给推荐一本。
      最后借贵地和大家讨论一个问题:从长远考虑,程序员学那项技术比较有前途?做程序也好几年了,想找一个领域好好深入一下,以后做一个行业的领域专家。那样才不会太累,要不什么都鼓捣,太累了,而且还不容易出成绩。我列举了几个方向,大家帮忙分析分析,谢谢。
    1、linux+oracle(走数据库管理的路线)
    2、汇编、c底层驱动开发(据说很简单,就那么几个指令,学一年就精通了,不像.NET,得老跟着走)
    3、ec++,kjava嵌入式开发(包括手机游戏,路由固件等开发)
    4、即时通讯行业(网络编程,包括网络游戏的服务端编程这些)
    5、搜索行业(不太了解)
    6、OA、工作流(自己做一套不用编程,拖拖拽拽画画就能实现企业业务流程的电子化,infopath,OSS,formserver,WF的那一套)
    7、.net网站开发(范围很大,要掌握的东西太多,会的人很多,深入的很少)
    8、流媒体开发(3G时代这玩意儿不知道能不能派上用场)
    【参考】
    idior的《Lucene.net系列》
    李刚、宋伟、邱哲的《ajax+lucene构建搜索引擎》

    下载地址:
    https://files.cnblogs.com/onlytiancai/WawaSearch.rar

  • 相关阅读:
    EntityFramework优缺点
    领导者与管理者的区别
    七个对我最好的职业建议(精简版)
    The best career advice I’ve received
    Difference between Stored Procedure and Function in SQL Server
    2015年上半年一次通过 信息系统项目管理师
    Difference between WCF and Web API and WCF REST and Web Service
    What’s the difference between data mining and data warehousing?
    What is the difference between a Clustered and Non Clustered Index?
    用new创建函数的过程发生了什么
  • 原文地址:https://www.cnblogs.com/onlytiancai/p/529980.html
Copyright © 2011-2022 走看看