2010-02-15 13 views
1

Contexte =>
L'appel de wcf, certaines procédures stockées aléatoires et les commandes SQL importent théoriquement certaines données.Le moyen le plus simple de réindexer les index lucene.net lorsque nhibernate.search est utilisé?

Exigences =>
Reindex index lucene pour certaines entités importées.

Question =>
Quelle est la manière la plus facile de faire cela? En théorie, si nhibernate est initialisé, nhibernate.search doit savoir quelles entités sont supposées être indexées. Par conséquent - je me demandais, y at-il des outils prêts à utiliser/whatnot pour répondre à mes exigences?


Le seul moyen est-il le this?

+1

Je l'ai utilisé de cette façon et ça marche bien –

Répondre

3

Mon approche rapide et sale =>

public static class LuceneReindexer 
    { 
     public static void Run() 
     {  
      var entityTypes = typeof(FooEntity).Assembly.GetTypes() 
       .Where(x => x.BaseType == typeof(Entity) 
        || x.BaseType == typeof(KeyedEntity)); 

      foreach (var t in entityTypes) 
       if (TypeDescriptor 
        .GetAttributes(t)[typeof(IndexedAttribute)] != null) 
         ReindexEntity(t); 
     } 

     private static void ReindexEntity(Type t) 
     { 
      var stop = false; 
      var index = 0; 
      const int pageSize = 500; 

      do 
      { 
       var list = NHibernateSession.Current.CreateCriteria(t) 
        .SetFirstResult(index) 
        .SetMaxResults(pageSize).List(); 

       NHibernateSession.Current.Transaction.Begin(); 
       foreach (var itm in list) 
        NHibernateSession.Current.Index(itm); 
       NHibernateSession.Current.Transaction.Commit(); 

       index += pageSize; 
       if (list.Count < pageSize) stop = true; 
      } while (!stop); 
     } 
    } 

Aucune idée sur la transaction et une partie d'échange (et ne se soucient pas pour le moment). Genre a fait ce dont j'avais besoin. : D