我如何创建一个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.");
}

我如何创建一个LockFactory为Lucene.net

从你发布的代码我不明白为什么你需要比默认的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()方法,如所示。