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

问题描述 投票:0回答:2

在我的一个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的不良做法)?

c# lucene lucene.net
2个回答
1
投票

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


1
投票

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

代码看起来像这样:

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.