Lucene.net之解决锁的问题

摘要:
49boolisUpdate=IndexReader.IndexExists;50if51{52//同时,只有一段代码可以写入索引库。当使用IndexWriter打开目录时,索引库文件将被自动锁定。稍后将解决此问题)54if55{56IndexWriter。Unlock;57}58}59//将索引写入索引库中。isUpdate,Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED);6263//从队列64SearchContentsearch=indexQueue中获取数据。退出队列();65//我们需要将文件66Documentdocument=newDocument()添加到Lucene中。net索引库//表示文档。
 1   public sealed class SearchIndexManager
 2     {
 3         private static readonly SearchIndexManager searchManager=new SearchIndexManager();
 4         private SearchIndexManager()
 5         {
 6         
 7         }
 8         public static SearchIndexManager GetSingleSearchManager()
 9         {
10             return searchManager;
11         }
12         private Queue<SearchContent> indexQueue = new Queue<SearchContent>();
13         /// <summary>
14         /// 添加索引
15         /// </summary>
16         public void AddIndex(SearchContent  indexContent)
17         {
18             indexContent .IndexType =CreateIndexEnum .Add;
19             indexQueue.Enqueue(indexContent);
20         }
21         /// <summary>
22         /// 删除索引
23         /// </summary>
24         /// <param name="indexContent"></param>
25         public void DeleteIndex(SearchContent  indexContent)
26         {
27            indexContent .IndexType =CreateIndexEnum .Delete;
28             indexQueue .Enqueue (indexContent);
29         }
30         //没输入一条数据就添加相应的索引,为了解决锁的问题,使用队列的方式,向队列中添加数据,接下来就是从队列中取出数据,添加到lucen的索引库中
31         public void StartIndexThread()
32         {
33             Thread thread = new Thread(new ThreadStart(CreateIndex));
34             thread.IsBackground = true;
35             thread.Start();
36         }
37         public void CreateIndex()
38         {
39             while (true)
40             {
41                 if (indexQueue.Count > 0)
42                 {
43                     //创建索引
44                     //将创建的分词内容放在该目录下
45                     string indexPath = @"D:LuceneDir";
46                     //为Lucent.net指定索引文件(打开索引目录) FS指的是就是FileSystem
47                     FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexPath), new NativeFSLockFactory());
48                     //IndexReader:对索引进行读取的类。该语句的作用:判断索引库文件夹是否存在以及索引特征文件是否存在。
49                     bool isUpdate = IndexReader.IndexExists(directory);
50                     if (isUpdate)
51                     {
52                         //同时只能有一段代码对索引库进行写操作。当使用IndexWriter打开directory时会自动对索引库文件上锁。
53                         //如果索引目录被锁定(比如索引过程中程序异常退出),则首先解锁(提示一下:如果我现在正在写着已经加锁了,但是还没有写完,这时候又来一个请求,那么不就解锁了吗?这个问题后面会解决)
54                         if (IndexWriter.IsLocked(directory))
55                         {
56                             IndexWriter.Unlock(directory);
57                         }
58                     }
59                     //向索引库中写索引。这时在这里加锁。同时指定分词算法是盘古分词
60                     //通过writer会将索引写到我们制定的文件夹目录下
61                     IndexWriter writer = new IndexWriter(directory, new PanGuAnalyzer(), !isUpdate, Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED);
62 
63                     //从队列中取出数据
64                         SearchContent search=  indexQueue.Dequeue();
65                         //我们需要添加到Lucene.net索引库的文件
66                         Document document = new Document();//表示一篇文档。
67                         //Field.Store.YES:表示是否存储原值。只有当Field.Store.YES在后面才能用doc.Get("number")取出值来.Field.Index. NOT_ANALYZED:不进行分词保存
68                         //因为不会进行覆盖,所以需要将以前的打上删除标志,否则将会出现多个重复的
69                         writer.DeleteDocuments(new Term("id", search.ID.ToString()));
70 
71                         if (search.IndexType == CreateIndexEnum.Delete)
72                         {
73                             continue;
74                         }
75                         document.Add(new Field("id", search.ID.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
76 
77                         //Field.Index. ANALYZED:进行分词保存:也就是要进行全文的字段要设置分词 保存(因为要进行模糊查询)
78 
79                         //Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS:不仅保存分词还保存分词的距离。
80 
81                         document.Add(new Field("title", search.Title, Field.Store.YES, Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));
82                         document.Add(new Field("content", search.Content , Field.Store.YES, Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));
83                         writer.AddDocument(document);
84 
85                     writer.Close();//会自动解锁。
86                     directory.Close();//不要忘了Close,否则索引结果搜不到
87                 }
88                 else
89                 {
90                     Thread.Sleep(5000);
91                 }
92             }
93         }

免责声明:文章转载自《Lucene.net之解决锁的问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇热词统计以及Quartz.net的简单使用Lucene.net的简单使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

oracle数据库常用语句

--查看数据库版本--select * from product_component_version;-- 查看dbf存放位置select * from dba_data_files; -- 查看文件位置 SELECT * FROM dba_directories;-- 新建表空间create tablespace yycg logging datafile...

Elasticserch学习之多索引和多类别

在所有索引的所有类型中搜索: GET /_search 在索引gb的所有类型中搜索: GET /gb/_search 在索引gb和us的所有类型中搜索: GET /gb,us/_search 在以g或u开头的索引的所有类型中搜索: GET /g*,u*/_search 在索引gb的类型user中搜索: GET /gb/user/_searc...

数据库——MySQL——索引——索引原理及B+树

索引原理 我们使用索引,就是为了提高查询的效率,如同查书一样,先找到章,再找到章中对于的小节,再找到具体的页码,再到我们需要的内容。 事实上索引的本质就是不断缩小获取数据的筛选范围,找出我们想要的结果。同时把随机的事件变成顺序的事件,也就是说有了这种索引机制,我们就可以总是用同一种查找方式来锁定数据。 数据库也是一样,但显然要复杂的多,因为不仅面临着等...

基础数据类型及其相关操作总结

一.概念。 1 什么是数据? x=10,10是我们要存储的数据 2 为何数据要分不同的类型 数据是用来表示状态的,不同的状态就应该用不同的类型的数据去表示 3 数据类型 数字 字符串 列表 元组 字典 集合 二.基础数据类型。 2.1 int数字。 数字主要是用于计算用的,使用方法并不是很多,: #bit_length() 当十进制用二进制表示时,最少使用...

Oracle索引梳理系列(二)- Oracle索引种类及B树索引

版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载。转载时,请在文章明显位置注明原文链接。若在未经作者同意的情况下,将本文内容用于商业用途,将保留追究其法律责任的权利。如果有问题,请以邮箱方式联系作者(793113046@qq.com)。 Oracle索引种类 一 Oracle索引...

pandas之Series

Series是Pandas中最基本的对象,Series类似一种一维数组,在 Series 中包含的数据类型可以是整数、浮点、字符串、Python对象等。 pandas.Series(data=None, index=None, dtype=None, name=None, copy=False, fastpath=False) series的创建: 列表...