我如何创建一个LockFactory为Lucene.net
本文关键字:LockFactory 一个 Lucene net 创建 何创建 | 更新日期: 2023-09-27 18:03:21
我有一个WCF服务,它将索引写入文件系统。我担心,如果有多个客户端试图同时执行此操作,我可能会遇到线程问题。我看到FSDirectory.Open()有一个重载,允许我传递一个"LockFactory"。
我没有找到关于如何为Lucene .net创建这些LockFactories之一的任何文档。有人能告诉我在哪里可以找到一些关于LockFactory的文档或者我应该实现什么接口吗?
DirectoryInfo indexDirectory = new DirectoryInfo(ConfigurationManager.AppSettings["indexpath"]);
Directory luceneDirectory = FSDirectory.Open(indexDirectory);
try
{
IndexWriter indexWriter = new IndexWriter(luceneDirectory, new StandardAnalyzer());
Document document = new Document();
foreach (KeyValuePair<string,string> keyValuePair in _metaDataDictionary)
{
document.Add(new Field(keyValuePair.Key, keyValuePair.Value, Field.Store.YES, Field.Index.ANALYZED));
indexWriter.AddDocument(document);
}
indexWriter.Optimize();
indexWriter.Flush();
indexWriter.Close();
}
catch(IOException e)
{
throw new IOException("Could not read Lucene index file.");
}
从你发布的代码我不明白为什么你需要比默认的NativeFSLockFactory更多的东西。FSDirectory.Open()不带锁工厂参数的重载使用这个
要定制一个,必须实现抽象的LockFactory类。
不确定为什么Jf Beaulac的答案被接受,因为它没有回答问题。我花了很多时间才弄清楚这一点,在"Lucene in Action"中没有任何例子。所以,对于那些需要回答这个问题的人,以下是我最终得出的结论。
你不直接创建LockFactory,它是一个抽象类。您可以创建LockFactory的实现之一,例如singleinstancellockfactory。像这样:
using Lucene.Net.Store;
class Ydude{
FSDirectory fsd;
SingleInstanceLockFactory silf = new SingleInstanceLockFactory();
fsd = FSDirectory.Open(@"C:'My'Index'Path");
fsd.SetLockFactory(silf);
}
同样重要的是要注意的是,如果你提供一个路径字符串给构造函数,你不能在创建FSDirectory时直接添加LockFactory实例;只有在向构造函数提供DirectoryInfo时才能这样做。否则,您可以使用SetLockFactory()方法,如所示。