我有一个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.");
}
答案 0 :(得分:1)
从您发布的代码中我不明白为什么您需要的内容超过默认NativeFSLockFactory。不参与锁定工厂的FSDirectory.Open()重载使用了这个。
要制作自定义的,您必须实现抽象的LockFactory类。
答案 1 :(得分:0)
不确定为什么Jf Beaulac的回答被接受,因为它没有回答这个问题。我在解决这个问题上遇到了很多麻烦,“Lucene In Action”中没有它的例子。所以对于那些需要回答这个问题的人来说,这就是我最终想出来的。
您不直接创建LockFactory,它是一个抽象类。您可以创建LockFactory的一个实现,例如SingleInstanceLockFactory。像这样:
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()方法执行此操作,如图所示。