• 小菜学习Lucene.Net(更新3.0.3版本使用)


    花了两天的时间研究了下Lucene.Net 发现确实挺好玩.... 最新版本是3.0.3 (最后更新时间2012-10)

      可惜3.0.3版本的Lucene.net无法和盘古分词 (最新版为2.3.1.0 最后更新时间 2010-10)一起使用.....因为盘古分词 基于2.9.x.x版本 写的 ,在 3.0.3中很多 接口 和 类名 发生了 变化..(当然 网上 也有解决方案 :基于新的接口 重新 编译 盘古分词)

      今天主要用的是 Lucene.Net 2.9.2.2 与盘古分词 2.3.0.0版本.

      主要功能就是 创建索引,和搜索 下面贴出 2段代码

          创建索引:

      

     View Code

        搜索代码:

    复制代码
    string indexPath = @"C:lucenedir";//最好将该项放在配置文件中。
                string kw = Request["txtContent"];
                kw = kw.ToLower();
                FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexPath), new NoLockFactory());
                IndexReader reader = IndexReader.Open(directory, true);
                IndexSearcher searcher = new IndexSearcher(reader);
                //搜索条件
               //PhraseQuery query = new PhraseQuery();
           BooleanQuery queryMsg = new BooleanQuery();//或者条件
           TermQuery query = null;
                foreach (string word in Common.WebCommon.SplitWord(kw))//将用户输入的搜索内容进行了盘古分词、
                {
                     query = new TermQuery(new Term("msg", word));
                    //query.Add(new Term("msg", word));
                  queryMsg.Add(query, BooleanClause.Occur.SHOULD);
                    
                }
            
                //query.SetSlop(100);//多个查询条件的词之间的最大距离.在文章中相隔太远 也就无意义.(例如 “大学生”这个查询条件和"简历"这个查询条件之间如果间隔的词太多也就没有意义了。)
                //TopScoreDocCollector是盛放查询结果的容器
                TopScoreDocCollector collector = TopScoreDocCollector.create(1000, true);
                searcher.Search(queryMsg, null, collector);//根据query查询条件进行查询,查询结果放入collector容器
                ScoreDoc[] docs = collector.TopDocs(0, collector.GetTotalHits()).scoreDocs;//得到所有查询结果中的文档,GetTotalHits():表示总条数   TopDocs(300, 20);//表示得到300(从300开始),到320(结束)的文档内容.       //可以用来实现分页功能
        
                List<SearchResult> list = new List<SearchResult>();
                for (int i = 0; i < docs.Length; i++)
                {
                    //
                    //搜索ScoreDoc[]只能获得文档的id,这样不会把查询结果的Document一次性加载到内存中。降低了内存压力,需要获得文档的详细内容的时候通过searcher.Doc来根据文档id来获得文档的详细内容对象Document.
                    int docId = docs[i].doc;//得到查询结果文档的id(Lucene内部分配的id)
                    Document doc = searcher.Doc(docId);//找到文档id对应的文档详细信息
                    SearchResult result = new SearchResult();
                    result.Msg =Common.WebCommon.Highlight(kw,doc.Get("msg"));
                    result.Title = doc.Get("title");
                    result.Url = "/BookDeatail.apsx?id=" + doc.Get("id");
                    list.Add(result);
                }
                this.SearchRepeater.DataSource = list;
                this.SearchRepeater.DataBind();
             
               
    复制代码

    大体 思路就是 这样子 不错 这两坨代码 太难看了 于是 我基于这2段 代码 封装下了于是有了  LuceneHelper

     View Code

    使用方法:

     View Code

     以上为2.9.2.2 版本

    经过几天的摸索,发现 3.0.3 改变不是很大...于是写了一份Lucene3.0.3的Helper

    代码:

     View Code

    使用方式 通上个版本 只是修改 版本的兼容性

  • 相关阅读:
    Laravel模型间关系设置分表方法详解
    11个PHP程序员最常犯的MySQL错误
    教你使用swoole监听redis数据
    使用 Docker 环境来开发 PHP,Laradock 系列 1
    tp5 workerman安装不上解决方法
    一种颗粒度很小的 Laravel 路由文件划分方式
    VT 调试环境搭建
    masm32基本配置与写出第一个汇编程序
    [debug] 解决pycharm中无法import自己建立的模块问题
    《Windows内核安全与驱动开发》 7.1&7.2&7.3 串口的过滤
  • 原文地址:https://www.cnblogs.com/zhwl/p/3488790.html
Copyright © 2020-2023  润新知