你的位置:首页 > 软件开发 > ASP.net > MVC+MQ+WinServices+Lucene.Net Demo

MVC+MQ+WinServices+Lucene.Net Demo

发布时间:2015-04-01 14:01:59
前言:我之前没有接触过Lucene.Net相关的知识,最近在园子里看到很多大神在分享这块的内容,深受启发。秉着“实践出真知”的精神,再结合公司项目的实际情况,有了写一个Demo的想法,算是对自己能力的考验吧。 功能描述:1. 前台网站把 ...

前言:

我之前没有接触过Lucene.Net相关的知识,最近在园子里看到很多大神在分享这块的内容,深受启发。秉着“实践出真知”的精神,再结合公司项目的实际情况,有了写一个Demo的想法,算是对自己能力的考验吧。

 

功能描述:

1. 前台网站把新增的索引项对象(标题、内容)序列化后,发送给MQ

2. MQ接收到消息后先持久化,再推送给消息的消费者

3. 消息的消费者(WinServices)接收到消息后,反序列化成索引项对象,调用SearchEngine类库的创建索引方法

4. 前台网站调用SearchEngine类库的查询方法,并传入用户输入的关键字,把查询后匹配的结果显示在View上

注:

1. 为了模拟多个用户同时新增索引项对象,互联网本身就是一个多get='_blank'>线程的环境。这里使用了ActiveMQ的队列模式(另外还有主题模式,主要用于消息广播的场景),因为其内部维护了一个先进先出的队列,可以保证每次只能有一个消息被接收,所有其它待接收的都需要排队等待。

2. 这里引入了分布式项目的思想,前台网站只复制新增索引项和查询,MQ负责消息的接收和推送,WinServices负责生成索引文件。

3. 因为还只是Demo,所以很多功能还不完善,离真正企业级应用还有很大的差距,目的只是想练练手,熟悉下相关的知识点。

 

流程图:

MVC+MQ+WinServices+Lucene.Net Demo

 

架构图:

MVC+MQ+WinServices+Lucene.Net Demo

 

层次图:

MVC+MQ+WinServices+Lucene.Net Demo

 

项目结构:

MVC+MQ+WinServices+Lucene.Net Demo

LuceneTest.Entity:定义索引项和查询结果类的类库

LuceneTest.MQ:封装消息队列(ActiveMQ)发送和接收功能的类库

LuceneTest.Web:用于管理索引项和查询的MVC工程

LuceneTest.WinService.Test:用于WinService测试的WinForm工程

LuceneTest.SearchEngine:封装Lucene.Net的创建索引和根据关键字查询的类库

 

关键代码片段:

 1     /// <summary> 2     /// 创建索引 3     /// </summary> 4     /// <param name="model"></param> 5     public void CreateIndex(IndexSet model) 6     { 7       //打开 索引文档保存位置 8       var directory = FSDirectory.Open(new DirectoryInfo(this._indexPath), new NativeFSLockFactory()); 9       //IndexReader:对索引库进行读取的类10       var isExist = IndexReader.IndexExists(directory);11 12       if (isExist)13       {14         //如果索引目录被锁定(比如索引过程中程序异常退出或另一进程在操作索引库),则解锁15         if (IndexWriter.IsLocked(directory))16           //手动解锁17           IndexWriter.Unlock(directory);18       }19 20       //创建向索引库写操作对象,IndexWriter(索引目录,指定使用盘古分词进行切词,最大写入长度限制)21       //补充:使用IndexWriter打开directory时会自动对索引库文件上锁22       var writer = new IndexWriter(directory, new PanGuAnalyzer(), !isExist, IndexWriter.MaxFieldLength.UNLIMITED);23       //新建文档对象,一条记录对应索引库中的一个文档24       var document = new Document();25 26       //向文档中添加字段27       //所有字段的值都将以字符串类型保存,因为索引库只存储字符串类型数据28 29       //Field.Store:是否存储原文:30       //Field.Store.YES:存储原值(如显示原内容必须为YES),可以用document.Get取出原值31       //Field.Store.NO:不存储原值32       //Field.Store.COMPRESS:压缩存储33 34       //Field.Index:是否创建索引:35       //Field.Index.NOT_ANALYZED:不创建索引 36       //Field.Index.ANALYZED:创建索引(利于检索)37 38       //WITH_POSITIONS_OFFSETS:指示不仅保存分割后的词,还保存词之间的距离39       document.Add(new Field("title", model.Title, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS));40       document.Add(new Field("content", model.Content, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS));41 42       //文档写入索引库43       writer.AddDocument(document);44 45       //会自动解锁46       writer.Close();47       //不要忘了Close,否则索引结果搜不到48       directory.Close();49     }

原标题:MVC+MQ+WinServices+Lucene.Net Demo

关键词:.NET

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。