C# Lucene.NEt索引更新+;结构图

C# Lucene.NEt索引更新+;结构图,c#,structuremap,lucene.net,C#,Structuremap,Lucene.net,我有一个简单的lucene索引搜索器,它是由一个通宵工作构建的。这将替换为新索引(通过覆盖现有索引)。此交换时间约为一分钟。(复印时间) lucene搜索位于WCF服务中,它使用structuremap引导服务。 我尝试使用下面的方法。 1) 我已经注册了索引a this.ForRequestedType() .AddConcreteType().Assinglets() 但是,通过这种方法,LuceneRepository中的indexsearcher定义如下: _searcher=newin

我有一个简单的lucene索引搜索器,它是由一个通宵工作构建的。这将替换为新索引(通过覆盖现有索引)。此交换时间约为一分钟。(复印时间)

lucene搜索位于WCF服务中,它使用structuremap引导服务。 我尝试使用下面的方法。 1) 我已经注册了索引a this.ForRequestedType() .AddConcreteType().Assinglets()

但是,通过这种方法,LuceneRepository中的indexsearcher定义如下: _searcher=newindexsearcher(ObjectFactory.GetNamedInstance
(“Lucenevendoralias董事会”),真实); 永远不会释放,并且indexwriter(在索引作业中)无法交换索引

2) 我必须使用下面的方法为每个WCF调用创建实例 this.ForRequestedType() .AddConcreteType() .LifecycleIs(新结构MapOperationContextLifecycle())

这意味着,对于每次WCF调用,它都会创建lucene repository的新实例,其中包含500k的数据。如果50个客户端同时调用该服务,这不是一个好的解决方案

-我想为我的第一方法得到一些帮助。 拥有lucene存储库的单个实例并对其进行更新的最佳实践是什么

我们没有任何维护窗口,因此服务无法关闭。

索引搜索器(ObjectFactory.GetNamedInstance (“Lucenevendoralias董事会”),真实);对我来说,这似乎是一个相当不可靠的解决方案。如果要避免停机,应该将索引复制到新位置,并在索引完成后指向它。否则,当它处于不一致状态时,可能会读取它

我认为您需要让您的wcf应用程序知道何时完成索引交换,然后您可以执行以下操作:

ObjectFactory.Configure(c => c.ForRequestedType<IndexSearcher>()
  .Singleton().TheDefault.Is
  .Object(new IndexSearcher(
    ObjectFactory.GetNamedInstance("LuceneVendorAliasDirectory"), true)));
ObjectFactory.Configure(c=>c.ForRequestedType()
.Singleton().TheDefault.Is
.Object(新索引搜索器)(
GetNamedInstance(“LuceneVendorAliasDirectory”),true);
这将用一个新实例替换当前实例,但在将来的请求中将其作为单个实例重用


PS-看起来您使用的是旧版本的StructureMap,因此我的语法可能有点不正确。

我找不到一种简单的方法将alias目录包装到存储库中,并提出了解决方案。您对IndexSearcher(ObjectFactory.GetNamedInstance(“LuceneVendorAliasDirectory”)有更好的建议吗?是的。另外,在执行配置时,可能会有其他线程接受请求,我认为我们需要对其进行锁定。我将尝试一下。