以正确的方式使用Lucene.Net IndexReader

时间:2019-02-06 10:16:38

标签: c# lucene lucene.net

在我的WCF解决方案之一中,用户可以在Lucene索引上进行搜索。我希望获得有关此方法的意见。

我可以以更好的方式改进此代码吗?

public class ViewData
{            
        public static IndexReader indexReader
        {
            get
            {  
                return IndexReader.Open(FSDirectory.Open("path"), true);
            }
            private set { indexReader = value; }
        }
        public static IndexSearcher indexSearcher { get; set; }
}

要消费

using (indexSearcher = new IndexSearcher(indexReader))
{
    // run the search etc
}

这意味着当以这种方式打开搜索器时,IndexReader永远不会关闭。

但是,如果我喜欢以下内容。

using (indexReader)
using (indexSearcher = new IndexSearcher(indexReader))
{
        // run the search etc
}

但这意味着阅读器总是关闭然后重新打开吗?我是否可以跳过using(indexReader)并保持打开状态(因为IndexReaderDisposable,这不是不好的做法)吗?

2 个答案:

答案 0 :(得分:1)

在我们的应用程序中,我们通过使用接受Lucene Directory路径的IndexSearcher的构造方法重载来避免该问题。

代码看起来像这样:

using (var searcher = new IndexSearcher(FSDirectory.Open(new DirectoryInfo(_luceneSearchPath.GetActiveIndexPath()))))
{
    // run the search etc
}

接受IndexReader的构造函数的文档说:“ 如果通过指定目录隐式提供了IndexReader,则IndexReader将关闭。”。所以我想说关闭IndexReader是正确的事情。

搜索时性能在我们的应用程序中很好,并且内存泄漏没有问题。

答案 1 :(得分:0)

您可以将IndexReader和IndexSearcher实例重用于几个请求。它们是线程安全的,可以同时处理多个请求。无需关闭或丢弃读者和搜索对象,垃圾收集将自动处理该问题。实际上,如果您要在多个请求上重用实例,将很难做到,因为您不知道是否有人同时使用它。