正确使用 Lucene.Net IndexReader
Use Lucene.Net IndexReader in the right way
在我的一个 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
}
但这意味着 reader 总是关闭并重新打开?我可以跳过 using(indexReader)
并保持打开状态吗(因为 IndexReader
是 Disposable
,这不是不好的做法)吗?
在我们的应用程序中,我们通过使用接受 Lucene Directory 路径的 IndexSearcher
的构造函数重载来避免这个问题。
代码看起来像这样:
using (var searcher = new IndexSearcher(FSDirectory.Open(new DirectoryInfo(_luceneSearchPath.GetActiveIndexPath()))))
{
// run the search etc
}
接受 IndexReader 的构造函数的文档说“如果通过指定目录隐式提供 IndexReader,则 IndexReader 将关闭。”。所以我会说关闭 IndexReader 是正确的做法。
我们的应用程序在搜索时的性能很好,并且没有内存泄漏问题。
您可以为多个请求重复使用 IndexReader 和 IndexSearcher 实例。它们是线程安全的,可以同时处理多个请求。无需关闭或处理您的阅读器和搜索,垃圾收集会自动处理。事实上,如果您在多个请求中重复使用实例,将很难做到,因为您不知道是否有人同时使用它。
在我的一个 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
}
但这意味着 reader 总是关闭并重新打开?我可以跳过 using(indexReader)
并保持打开状态吗(因为 IndexReader
是 Disposable
,这不是不好的做法)吗?
在我们的应用程序中,我们通过使用接受 Lucene Directory 路径的 IndexSearcher
的构造函数重载来避免这个问题。
代码看起来像这样:
using (var searcher = new IndexSearcher(FSDirectory.Open(new DirectoryInfo(_luceneSearchPath.GetActiveIndexPath()))))
{
// run the search etc
}
接受 IndexReader 的构造函数的文档说“如果通过指定目录隐式提供 IndexReader,则 IndexReader 将关闭。”。所以我会说关闭 IndexReader 是正确的做法。
我们的应用程序在搜索时的性能很好,并且没有内存泄漏问题。
您可以为多个请求重复使用 IndexReader 和 IndexSearcher 实例。它们是线程安全的,可以同时处理多个请求。无需关闭或处理您的阅读器和搜索,垃圾收集会自动处理。事实上,如果您在多个请求中重复使用实例,将很难做到,因为您不知道是否有人同时使用它。