Lucene.Net 文件被锁问题,请大家指点一下
public void GetIndex(int inum)
{
//定义分析器
Analyzer KTDanalyzer = new KTDictSegAnalyzer(dictPath);
//PerFieldAnalyzerWrapper可以对不同的Field进行不同的分析
PerFieldAnalyzerWrapper wrapper = new PerFieldAnalyzerWrapper(KTDanalyzer);
wrapper.AddAnalyzer("ID", KTDanalyzer);
wrapper.AddAnalyzer("ProbContent", KTDanalyzer);
wrapper.AddAnalyzer("DateTime", KTDanalyzer);
//判断是否已有索引
bool isure = !IndexReader.IndexExists(_indexDirectory);
//创建索引的数据条数
allNum = dt.Rows.Count;
//实例化IndexWriter
_writer = new IndexWriter(_indexDirectory, wrapper, isure); //创建IndexWriter
_writer.SetUseCompoundFile(true); //显式设置索引为复合索引
_writer.SetMaxFieldLength(int.MaxValue); //设置域最大长度为最大值
_writer.SetMergeFactor(allNum + 100); //设置每100个段合并成一个大段
_writer.SetMaxMergeDocs(10000); //设置一个段的最大文档数
_writer.SetMaxBufferedDocs(1000); //设置在把索引写入磁盘前内存里文档的缓存个数
//创建IndexReader
IndexReader reader = null;
bool needre = inum == 1;
reader = IndexReader.Open(_indexDirectory);
Lucene.Net.Store.Directory ramdirectory = new RAMDirectory(_indexDirectory);
//文件是否锁住_indexDirectory索引文件地址
if (IndexReader.IsLocked(_indexDirectory))
{
IndexReader.Unlock(ramdirectory);
}
for (int i = 0; i < dt.Rows.Count; i++)
{
cpNum = i + 1;
string ProbID = dt.Rows[i]["PC_ProblemID"].ToString();
string title = parseHtml(dt.Rows[i]["PC_ProbContentHtml"].ToString());
if (title.Length > 2)
{
if (needre)
{
Term term = new Term("ID", ProbID);
reader.DeleteDocuments(term);
}
AddDocument(_writer, ProbID, title, DateTime.Now.ToString());
}
}
reader.Close();
_writer.Optimize();
_writer.Close();
}
static void AddDocument(IndexWriter writer, string StringID, string ProbContent, string Prob_Date)
{
Document document = new Document();
document.Add(new Field("ID", StringID, Field.Store.YES, Field.Index.UN_TOKENIZED));
document.Add(new Field("ProbContent", ProbContent, Field.Store.NO, Field.Index.TOKENIZED));
document.Add(new Field("DateTime", Prob_Date, Field.Store.YES, Field.Index.UN_TOKENIZED));
writer.AddDocument(document);
}
运行后给出的错误是:
Lock obtain timed out: SimpleFSLock@D:\SmartBible\SmartBible\Index\IndexDirectory\write.lock
网上资料说是也说明了使用 "IndexReader.isLocked"、"IndexReader.unlock"来解决文件锁的问题
我添加了下面这段代码可依然不能更新
//文件是否锁住_indexDirectory索引文件地址
if (IndexReader.IsLocked(_indexDirectory))
{
IndexReader.Unlock(ramdirectory);
}
请大家指点一下