如何为Lucene.net创建LockFactory?

时间:2011-07-25 21:59:54

标签: c# lucene.net

我有一个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.");
}

2 个答案:

答案 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()方法执行此操作,如图所示。