2010-12-09 31 views
0

J'ai un simple chercheur d'index lucene qui est construit par un travail de nuit. Ceci est remplacé par le nouvel index (en remplaçant l'index existant) ce temps d'échange est d'environ une minute. (temps de copie)Lucene.NEt Index mises à jour + structuremap

La recherche lucene est à l'intérieur d'un service WCF et utilise structuremap pour amorcer le service. J'ai essayé d'utiliser cette approche ci-dessous. 1) J'ai enregistré l'index a this.ForRequestedType() .AddConcreteType(). AsSingletons();

Mais, avec cette approche, la IndexSearcher définie à l'intérieur LuceneRepository comme ci-dessous: _searcher = new IndexSearcher (ObjectFactory.GetNamedInstance
("LuceneVendorAliasDirectory"), true); n'est jamais publié et l'indexeur (dans le travail d'indexation) ne parvient pas à échanger l'index.

2) je devais utiliser l'approche ci-dessous de créer par exemple WCF appel this.ForRequestedType() .AddConcreteType() .LifecycleIs (nouveau StructureMapOperationContextLifecycle()); Qu'est-ce que cela signifie pour chaque appel WCF, il crée une nouvelle instance de référentiel lucene, avec 500k de données ce n'est pas une bonne solution si 50 clients appellent le service en même temps.

-Je voudrais obtenir de l'aide pour mon approche numéro 1. Quelle est la meilleure pratique d'avoir un seul instane de référentiel lucene et de le mettre à jour?

Nous n'avons aucune fenêtre de maintenance pour que le service ne puisse pas être arrêté.

Répondre

1

IndexSearcher (ObjectFactory.GetNamedInstance ("LuceneVendorAliasDirectory"), true); Cela me semble une solution plutôt instable. Si vous voulez éviter les temps d'arrêt, vous devriez copier l'index vers un nouvel emplacement et le pointer après l'avoir fait. Sinon, il peut être lu lorsqu'il est dans un état incohérent.

Je pense que vous devez rendre votre application WCF au courant lorsque l'indice se fait d'être échangé, alors vous pouvez faire quelque chose comme ceci:

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

Cela remplacera l'instance actuelle par une nouvelle, mais réutilisez-le comme un singleton dans les futures demandes. PS: on dirait que vous utilisez une ancienne version de StructureMap, donc ma syntaxe est peut-être un peu fausse.

+0

Je n'ai pas trouvé de moyen facile d'encapsuler le répertoire d'alias dans un référentiel et de trouver une solution. Avez-vous de meilleures suggestions pour IndexSearcher (ObjectFactory.GetNamedInstance ("LuceneVendorAliasDirectory"), true.En outre, lors de l'exécution de configure, il pourrait y avoir une autre demande d'acceptation de threads, je pense que nous aurons besoin de mettre un verrou autour de lui. essayer. – bkhanal