Lucene.NEt Обновления индекса + структура карты - PullRequest
0 голосов
/ 09 декабря 2010

У меня есть простой поисковик индекса lucene, который создается с помощью ночной работы.Это заменяется новым индексом (переопределяя существующий индекс), это время обмена составляет около минуты.(время копирования)

Поиск lucene находится внутри службы WCF, и он использует структурную карту для начальной загрузки службы.Я попытался использовать этот подход ниже.1) Я зарегистрировал индекс this.ForRequestedType () .AddConcreteType (). AsSingletons ();

Но при таком подходе indexsearcher определен внутри LuceneRepository, как показано ниже: _searcher = new IndexSearcher (ObjectFactory.GetNamedInstance
("LuceneVendorAliasDirectory"), true);никогда не освобождается, и indexwriter (в задании индексирования) не может поменять местами индекс.

2) Мне пришлось использовать следующий подход для создания экземпляра для вызова WCF this.ForRequestedType () .AddConcreteType () .LifecycleIs (new StructureMapOperationContextLifecycle ());

Это означает, что для каждого вызова WCF он создает новый экземпляр хранилища lucene, с 500 КБ данных - не очень хорошее решение, если 50 клиентов одновременно вызывают службу.

-Я хотел бы получить помощь для моего подхода № 1.Какова лучшая практика использования единого экземпляра хранилища lucene и его обновления?

У нас нет окна обслуживания, поэтому служба не может быть недоступна.

1 Ответ

1 голос
/ 10 декабря 2010

IndexSearcher (ObjectFactory.GetNamedInstance ("LuceneVendorAliasDirectory"), правда); Звучит как довольно шаткое решение для меня. Если вы хотите избежать простоя, вы должны скопировать индекс в новое место и указать на него после его завершения. В противном случае он может быть прочитан, когда он находится в несогласованном состоянии.

Я думаю, что вам нужно, чтобы приложение wcf знало, что после завершения индекса происходит подкачка, тогда вы можете сделать что-то вроде этого:

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

Это заменит текущий экземпляр новым, но будет использовать его как одиночный в будущих запросах.

PS - похоже, вы используете старую версию StructureMap, поэтому мой синтаксис может быть немного не таким.

...