2011-01-10 3 views
0

Когда я создаю исходный индекс из существующей базы данных, тип записей в Lucene индексируется как < _hibernate_class: Castle.Proxies. MuestraProxy, DynamicProxyGenAssembly2>NHibernate.Search + дубликаты записей Lucene.NET

Однако, когда новый объект добавляется с помощью NHibernate он индексируется в < _hibernate_class: RALVet.Model. Muestra, RALVet>}, который создает дубликаты записей в Lucene, один как настоящий класс, а другой - как прокси.

Я пытался использовать NHibernateUtil.GetClass() при создании индекса, но он все еще возвращает прокси.

Это код, который строит начальный индекс:

private static void CreateIndex<T>() 
    { 
     var fullTextSession = 
      NHibernate.Search.Search.CreateFullTextSession(BootStrapper.SessionFactory.OpenSession()); 
     using(var tran = fullTextSession.BeginTransaction()) 
     { 
      var query = fullTextSession.CreateQuery(string.Concat("from ", typeof (T).Name)); 

      foreach (var doc in query.List()) 
      { 
       fullTextSession.Index(doc); 
      // fullTextSession.Index(NHibernateUtil.GetClass(doc)); 
      } 
      tran.Commit(); 
     } 
     fullTextSession.Close(); 
    } 

ответ

0

Хорошо, я, наконец, получил это работает отлично.

Проблема заключалась в том, что я использовал перехватчик для внедрения реализации INotifyPropertyChanged в мои объекты. Удаление перехватчика сделало NH.Search и Lucene.net работать хорошо.

0

Edit 2: Ну, я сделал еще один поиск по SO и я думаю, что вы должны смотреть на this answer. Я не могу воспроизвести вашу проблему, так что или здесь есть что-то другое (ваши конфигурации или модели домена?), Или я полностью не понимаю смысла. Удачи!


Я собираюсь попытаться угадать причину здесь (я не использую C# или HQL, так что если что-то в этой области, я может быть не повезло). Я думаю, что вы видите, потому что используете бескамерную версию метода .List(). Вы должны попытаться использовать .List<T>(), который будет указывать тип, который вы ожидаете при перечислении своих объектов.

Я думаю, что

Еогеасп (вар документ в query.List <T>()) { fullTextSession.Index (док); }

должен сделать трюк.


Edit: ИТАК, видимо, он не работает с добавленным <T> (видимо фрагмента кода поел скобки, поэтому убедитесь, что вы копируете вставили правильную версию, если вы сделали это).

FWIW, что мы делаем на работе ниже. Мы используем шаблон UnitOfWork, поэтому UnitOfWork запускает текущую конфигурацию и сеанс Nhibernate. Я использовал отражатель, чтобы перейти от Vb.net в C#

  DocumentBuilder db = SearchFactoryImpl.GetSearchFactory(UnitOfWork.Configuration).GetDocumentBuilder(typeof(T)); 
      IList<T> results = null; 
      PropertyInfo pi = typeof(T).GetProperty("Id"); 
      // an internal method that pages the data from the DB, returning true while there's more to process 
      while (this.InnerPageThrough<T>(ref results, pageNumber, itemsPerPage)) 
      { 
       IndexWriter iw = new IndexWriter(this.CheminIndexation + @"\" + typeof(T).Name, new StandardAnalyzer(), false); 
       iw.SetMaxMergeDocs(0x186a0); 
       iw.SetMergeFactor(0x3e8); 
       iw.SetMaxBufferedDocs(0x2710); 
       iw.SetUseCompoundFile(false); 
       using (Timer.Start("indexing + Conversions.ToString(results.Count) + " objects " + typeof(T).Name)) 
       { 
        // Sorry, looks like crap through the translation 
        IEnumerator<T> VB$t_ref$L3; 
        try 
        { 
         VB$t_ref$L3 = results.GetEnumerator(); 
         while (VB$t_ref$L3.MoveNext()) 
         { 
          T Entity = VB$t_ref$L3.Current; 
          object EntityId = RuntimeHelpers.GetObjectValue(pi.GetValue(Entity, null)); 
          iw.AddDocument(db.GetDocument(Entity, RuntimeHelpers.GetObjectValue(EntityId), typeof(T))); 
         } 
        } 
        finally 
        { 
         if (VB$t_ref$L3 != null) 
         { 
          VB$t_ref$L3.Dispose(); 
         } 
        } 
       } 
       iw.Flush(true, true, true); 
       iw.Close(); 
       UnitOfWork.CurrentSession.Clear(); 
       pageNumber++; 
      } 
      if (Optimize) 
      { 
       using (Timer.Start("optimising index")) 
       { 
        IndexWriter iw = new IndexWriter(this.CheminIndexation + @"\" + typeof(T).Name, new StandardAnalyzer(), false); 
        iw.Optimize(); 
        iw.Close(); 
       } 
      } 
     } 
    } 
} 

Я собираюсь попытаться воспроизвести вас проблему в более компактной образом

+0

Спасибо, сэми, к сожалению, это не проблема. – JAG

+0

Сэмми, спасибо за ваши усилия, я очень ценю это. Я тестировал ваш код и изучал проблему. В конфигурации я установил Interceptor (чтобы помочь мне привязать данные к объектам), и это вызывает проблему. Если перехватчик не установлен, я не получаю повторяющиеся записи. Так что это, кажется, проблема. Я обновлю сообщение, когда буду уверен, что проблема ушла. Еще раз спасибо. – JAG

+0

Нет проблем, я с облегчением вижу, что это была внешняя проблема, а не странная ошибка – samy

Смежные вопросы