Lucene全文检索-从零开始(4)

1.索引的追加

索引的追加是比较耗时的,如果等执行完毕再向用户返回结果,长时间的等待会使用户崩溃……。所以此处我们使用消息队列,保证第一时间响应用户,其他的耗时操作交给消息队列吧。

 1   protected void AddIndex_Click(object sender, EventArgs e)
 2     {
 3         //search. AddIndex();
 4         string Insertstr = "insert into  Article (Title,Contents,Time) values (‘天天就要向上‘,‘天天就要向上‘,‘" + DateTime.Now + "‘) select @@identity ";
 5         int id = Convert.ToInt32((DbHelperSQL.GetSingle(Insertstr)));
 6         China.Model.LuceneIndexArticle ar = new China.Model.LuceneIndexArticle();
 7         ar.ID = id;
 8         ar.Title = "天天就要向上";
 9         ar.Contents = "天天就要向上";
10         ar.AddTime = DateTime.Now.ToString();
11         IndexManage.NewsIndex.IndexAdd(ar);
12     }
 1     /// <Summary>
 2     /// 新增News时,添加新增索引到请求队列
 3     /// </Summary>
 4     /// <param name="artice"></param>
 5     public void IndexAdd(China.Model.LuceneIndexArticle artice)
 6     {
 7         ArticeViewModel addartic = new ArticeViewModel();
 8         addartic.DocId = artice.ID;
 9         addartic.Title = artice.Title;
10         addartic.HandlerType = IndexType.Insert;
11         addartic.Content = artice.Contents;
12         newsQueue.Enqueue(addartic);
13     }

2.删除一行数据,删除对应的索引

1     protected void Delete_oneIndex_Click(object sender, EventArgs e)
2     {
3         string delestr = "delete  from Article where ID=" + 1386;
4         DbHelperSQL.ExecuteSql(delestr);
5         IndexManage.NewsIndex.IndexDel(1386);
6     }
 1  /// <Summary>
 2     /// 删除数据时,添加删除请求到消息队列
 3     /// </Summary>
 4     /// <param name="artic"></param>
 5     public void IndexDel(int DocId)
 6     {
 7         ArticeViewModel delartic = new ArticeViewModel();
 8         delartic.OnlyKey = DocId.ToString();
 9         delartic.HandlerType = IndexType.Delete;
10         newsQueue.Enqueue(delartic);
11     }

3.修改索引

1   string upstr = "update News set Title=‘笑嘻嘻笑嘻嘻‘,Content=‘笑嘻嘻笑嘻嘻系‘ where DocId=" + 146475;
2         DbHelperSQL.ExecuteSql(upstr);
3         var wacth = Stopwatch.StartNew();
4         China.Model.LuceneIndexArticle ar = new China.Model.LuceneIndexArticle();
5         ar.ID = 146475;
6         ar.Title = "笑嘻嘻笑嘻嘻";
7         ar.Contents = "笑嘻嘻笑嘻嘻";
8         ar.AddTime = DateTime.Now.ToString();
9         IndexManage.NewsIndex.IndexAdd(ar);
 1  /// <Summary>
 2     /// 对原有所以进行修改
 3     /// </Summary>
 4     /// <param name="artic"></param>
 5     public void IndexModify(China.Model.LuceneIndexArticle artic)
 6     {
 7         ArticeViewModel Modartic = new ArticeViewModel();
 8         Modartic.DocId = artic.ID;
 9         Modartic.Title = artic.Title;
10         Modartic.Content = artic.Contents;
11         Modartic.HandlerType = IndexType.Modify;
12         newsQueue.Enqueue(Modartic);
13     }

4.下面我们来看在消息队列中,追加、删除、修改索引的具体操作

 1 FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexpath), new NativeFSLockFactory());
 2         bool isExsit = IndexReader.IndexExists(directory);
 3         if (isExsit)
 4         {
 5             if (IndexWriter.IsLocked(directory))
 6             {
 7                 IndexWriter.Unlock(directory);
 8             }
 9         }
10         IndexWriter writer = new IndexWriter(directory, PanGuAnalyzer, false);
11         //IndexWriter writer = new IndexWriter(directory, new PanGuAnalyzer(), !isExsit, IndexWriter.MaxFieldLength.LIMITED);
12         while (newsQueue.Count > 0)
13         {
14             Document document = new Document();
15             ArticeViewModel news = newsQueue.Dequeue();
16             if (news.HandlerType == IndexType.Insert)
17             {
18                 document.Add(new Field("ID", news.DocId.ToString(), Field.Store.YES, Field.Index.ANALYZED));
19                 document.Add(new Field("Title", news.Title, Field.Store.YES, Field.Index.ANALYZED));
20                 document.Add(new Field("Contents", news.Content, Field.Store.YES, Field.Index.ANALYZED));
21                 document.Add(new Field("OnlyKey", news.OnlyKey, Field.Store.YES, Field.Index.ANALYZED));
22                 writer.AddDocument(document);
23             }
24             else if (news.HandlerType == IndexType.Delete)
25             {
26                 writer.DeleteDocuments(new Term("OnlyKey", "News1388"));
27             }
28             else if (news.HandlerType == IndexType.Modify)
29             {
30                 //先删除 再新增
31                 writer.DeleteDocuments(new Term("OnlyKey", news.OnlyKey));
32                 document.Add(new Field("OnlyKey", news.OnlyKey, Field.Store.YES, Field.Index.NOT_ANALYZED));
33                 document.Add(new Field("Title", news.Title, Field.Store.YES, Field.Index.ANALYZED,
34                                         Field.TermVector.WITH_POSITIONS_OFFSETS));
35                 document.Add(new Field("Contnets", news.Content, Field.Store.YES, Field.Index.ANALYZED,
36                                         Field.TermVector.WITH_POSITIONS_OFFSETS));
37                 writer.AddDocument(document);
38             }
39         }
40         writer.Optimize();
41         writer.Close();
42         directory.Close();
时间: 2024-12-21 12:53:04

Lucene全文检索-从零开始(4)的相关文章

Lucene全文检索-从零开始(2)

1.lucene索引的创建 1 /// <Contents> 2 /// 讲list数据传入创建索引 3 /// </Contents> 4 /// <param name="datalist"></param> 5 /// <returns></returns> 6 public bool CreateIndex(List<LuceneIndexArticle> datalist) 7 { 8 FSD

jQuery、HTML5、Spring Security安全权限、Lucene全文检索

获取[下载地址]   QQ: 313596790   [免费支持更新]支持三大数据库 mysql  oracle  sqlsever   更专业.更强悍.适合不同用户群体[新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统]A 代码生成器(开发利器);      增删改查的处理类,service层,mybatis的xml,SQL( mysql   和oracle)脚本,   jsp页面 都生成   就不用写搬砖的代码了,生成的放到项目里,可以直接运行B 阿里巴巴数据库连接池druid

Lucene全文检索

 全文检索(Full-Text Retrieval)是指以文本作为检索对象,找出含有指定词汇的文本.全面.准确和快速是衡量全文检索系统的关键指标. l关于全文检索,我们要知道: 1,只处理文本. 2,不处理语义. 3,搜索时英文不区分大小写. 4,结果列表有相关度排序. l在信息检索工具中,全文检索是最具通用性和实用性的. Lucene全文检索

Spring MVC、Mybatis、Hibernate、Bootstrap、jQuery、HTML5、Spring Security安全权限、Lucene全文检索、Ehcache分布式缓存 、高性能、高并发【Java企业通用开发平台框架】

获取[下载地址]   QQ: 313596790   [免费支持更新] A 代码生成器(开发利器);    B 阿里巴巴数据库连接池druid;   数据库连接池  阿里巴巴的 druid.Druid在监控.可扩展性.稳定性和性能方面都有明显的优势 C 安全权限框架shiro ;  D ehcache 自定义二级缓存; E 微信接口开发(后续会加入Activiti5 工作流 )免费升级 -------------------------------------------------------

【Lucene】Apache Lucene全文检索引擎架构之入门实战

Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供.Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻.在Java开发环境里Lucene是一个成熟的免费开源工具.就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库.--<百度百科> 这篇博文主要从两个方面出发,首先介绍一下Lucene中的全文搜索原理,其次通过程序示例来展现如何使用Lucene.关于全文搜索原理部分我上网搜索了一下,也看了好几篇文章,最后在写这篇文

lucene全文检索技术

1:lucene的介绍 全文检索引擎工具包.作用:使用lucene进行全文检索 .可以直接运行. 什么是全文检索.全文检索的场景,搜索引擎,搜索商品. 站内搜索,只会搜索自己站内的资源 全文检索首先将要查询的目标文档中的词提取出来,组成索引,通过查询索引达到搜索的文档的目的 这种先建立索引,在对索引进行搜索的过程就叫全文检索. 索引就类似于书籍的目录,目标文档就相当于书籍中的内容 搜索书籍中的内容,如果不通过目录,很费劲 其实,全文检索就是相当于给书籍编写目录. 2:Lucene实现全文检索的流

Lucene全文检索之-Lucene基础

Lucene是全文检索引擎 一.在学习Lucene之前我们先思考下,Lucene存在的意义. 1.在之前我们的应用场景中,基于数据库的检索,我们使用like语法进行.但是基于like语法效率低下.达不到我们对应用的使用要求. 而使用Lucene对我们的数据建立索引效率高速度快,满足企业要求. 我们使用Lucene先对整个结构建立索引库,然后根据索引去查找我们需要匹配的内容,效率高速度快,方便我们快速检索信息-这也是Lucene存在的目的. 2.有些查找数据库做不了,比如我们想查找附件中内容的匹配

Lucene全文检索(一)

全文检索的概念 1.从大量的信息中快速.准确的查找要的信息2.收索的内容是文本信息3.不是根据语句的意思进行处理的(不处理语义)4.全面.快速.准确是衡量全文检索系统的关键指标.5.搜索时英文不区分大小写,结果列表有相关度排序. 全文检索与数据库搜索的区别 1.数据库搜索Eg: select * from article where content like ‘%here%’结果where  here 缺点:1).搜索效果比较差2).在搜索的结果中,有大量的数据被搜索出来,有很多数据是没有用的3

Lucene全文检索入门体验

Lucene是Apache开源的全文检索框架, 是单纯的搜索工具, 简单易用. 现在已经出到5.2.1的版本, 只需在项目中导入必需的几个jar包就能使用. 使用的过程可以概括为, 1)  建立索引 2) 搜索查找, 获取搜索结果 这里我们一起先来学习几个会用到的核心类: Directory 该类在Lucene中用于描述索引存放的位置信息. 比如: Directory dir = FSDirectory.open(Paths.get("c:\\lucene\\index")); 其中&