Lucene.NEt索引更新+结构图

时间:2010-12-09 19:52:22

标签: c# structuremap lucene.net

我有一个简单的lucene索引搜索器,它是由一夜之间的工作构建的。这被新索引替换(通过覆盖现有索引),这个交换时间大约是一分钟。 (复制时间)

lucene搜索在WCF服务中,它使用structuremap来引导服务。 我尝试在下面使用这种方法。 1)我已经注​​册了索引a                  this.ForRequestedType()                .AddConcreteType()AsSingletons();

但是,使用这种方法,indexsearcher在LuceneRepository中定义如下:             _searcher = new IndexSearcher(ObjectFactory.GetNamedInstance
                            (“LuceneVendorAliasDirectory”),true); 永远不会释放,而indexwriter(在索引作业中)无法交换索引。

2)我必须使用以下方法为每个WCF调用创建实例            this.ForRequestedType()                .AddConcreteType()               .LifecycleIs(new StructureMapOperationContextLifecycle());

这对于每个WCF调用意味着什么,它创建lucene存储库的新实例,如果50个客户端同时调用该服务,则500k的数据不是一个好的解决方案。

- 我想为我的第一种方法获得一些帮助。 拥有lucene存储库的单一实例并将其更新的最佳实践是什么?

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

1 个答案:

答案 0 :(得分:1)

IndexSearcher的(ObjectFactory.GetNamedInstance (“LuceneVendorAliasDirectory”),true);听起来像是一个非常不稳定的解决方案。如果您想避免停机,您应该将索引复制到新位置并在完成后指向它。否则,当它处于不一致状态时可能会被读取。

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

ObjectFactory.Configure(c => c.ForRequestedType<IndexSearcher>()
  .Singleton().TheDefault.Is
  .Object(new IndexSearcher(
    ObjectFactory.GetNamedInstance("LuceneVendorAliasDirectory"), true)));

这将用新的实例替换当前实例,但在将来的请求中将其重新用作单例。

PS - 看起来你正在使用旧版本的StructureMap,所以我的语法可能有些偏差。