gpt4 book ai didi

lucene.net - IndexWriter 和 IndexSearcher 的单例模式 Lucene.net

转载 作者:行者123 更新时间:2023-12-01 02:28:46 25 4
gpt4 key购买 nike

我正在使用 Lucene.net 3.0.3.0 (现在是最新版本)。我想知道是否使用 的单个实例IndexWriter 索引搜索器 在生产环境中是一个不错的选择(考虑线程安全)。我在文档中读到创建这些实例的新对象是一项昂贵的操作,并且在内部 lucene 可以很好地处理并发请求。

这是给在生产环境中使用过lucene.net的人一个疑问;请让我知道这是否可行!

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Lucene.Net.Search;
using Lucene.Net.Store;
using System.IO;

using Directory = Lucene.Net.Store.Directory;
using Version = Lucene.Net.Util.Version;
using Lucene.Net.Index;
using Lucene.Net.Analysis.Standard;
using Lucene.Net.Analysis;

namespace MXLuceneConsoleApp
{
/// <summary>
/// This helper class applies a singleton pattern to create Searcher and Writer objects as it's recommended to create them only once.
/// Also the searcher gets reinitialized, if any write happens.
/// </summary>
public class MXLuceneIndexHelper
{
private static IndexSearcher _searcher;
private static Directory _directory;
private static Lazy<IndexWriter> _writer = new Lazy<IndexWriter>(() => new IndexWriter(_directory, new StandardAnalyzer(Version.LUCENE_30), IndexWriter.MaxFieldLength.UNLIMITED));

//this private constructor makes it a singleton now.
private MXLuceneIndexHelper() { }

//Static constructor, opening the directory once for all.
static MXLuceneIndexHelper()
{
_directory = FSDirectory.Open(new DirectoryInfo(Environment.CurrentDirectory + "\\LuceneIndexDir"));
}

public static IndexSearcher IndexSearcher
{
get
{
if (_searcher == null)
{
InitializeSearcher();
}
else if (!_searcher.IndexReader.IsCurrent())
{
//_searcher.IndexReader.Reopen();
//refreshing the underlying Reader above doesn't do the trick, so I'm reinitializing the Searcher.
_searcher.Dispose();
InitializeSearcher();
}

return _searcher;
}
}

public static IndexWriter IndexWriter
{
get
{
//_writer.SetRAMBufferSizeMB(30.0);
return _writer.Value;
}
}

private static void InitializeSearcher()
{
_searcher = new IndexSearcher(_directory, false);

}
}//End of class
}

最佳答案

我的理解是每个索引应该只有 1 个 IndexWriter 实例。默认情况下,Lucene 中启用了内置锁定以确保这种情况。至于单例模式,我认为你应该看看新的 Lazy .NET 4 中的类。它免费处理所有锁定和空值检查。

对于 IndexSearcher,您可以随意拥有任意数量的实例。但是,我认为如果您重用现有的搜索器,性能会有所提升。我可以从您的代码中看出,您知道重新打开现有搜索器比创建新搜索器便宜得多。搜索器中还有内置缓存,在您进行第一次搜索时会初始化。您还可以实现一个 IndexReaderWarmer 来控制搜索器何时被加热(就像在第一次搜索之前一样)。

关于lucene.net - IndexWriter 和 IndexSearcher 的单例模式 Lucene.net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14473427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com