hibernate nhibernate lucene hibernate-search nhibernate.search

nHibernate.Search con nHibernate v2



lucene hibernate-search (1)

Tengo problemas para obtener nHibernate.Search para crear un índice.

Si uso 1.2.1.4 de nHibernate.dll & nHibernate.Search.dll entonces el índice se crea correctamente y puedo inspeccionarlo con Luke (una utilidad de Lucene). Se crea un archivo de segmentos, así como un archivo de Fragmentos, etc.

Sin embargo, cuando uso v 2 de nHibernate.dll & nHibernate.Search.dll, el índice no se crea correctamente. Solo se crea un archivo de 1k segmentos en el directorio Index y Luke no puede inspeccionarlo.

El código que utilicé en v1 fue el siguiente:

_configuration = new Configuration(); _configuration.Configure(); _configuration.AddAssembly(typeof (Contact).Assembly); _sessionFactory = _configuration.BuildSessionFactory(); SearchFactory.Initialize(_configuration, _sessionFactory);

y tengo lo siguiente en el archivo de configuración

<property name="hibernate.search.default.directory_provider">NHibernate.Search.Storage.FSDirectoryProvider, NHibernate.Search</property> <property name="hibernate.search.default.indexBase">~/Index</property>

en la versión 2 no hay SearchFactory. Lo único similar que pude encontrar fue

SearchFactoryImpl.GetSearchFactory(_configuration);

Así que configuré la configuración de la siguiente manera

_configuration = new Configuration(); _configuration.Configure(); _configuration.AddAssembly(typeof (Contact).Assembly); _sessionFactory = _configuration.BuildSessionFactory(); _configuration.SetProperty("hibernate.search.default.directory_provider", "NHibernate.Search.Store.FSDirectoryProvider, NHibernate.Search"); _configuration.SetProperty("hibernate.search.default.indexBase", "Index"); _configuration.SetProperty("hibernate.search.analyzer", "Lucene.Net.Analysis.Standard.StandardAnalyzer, Lucene.Net"); _configuration.SetListener(ListenerType.PostUpdate, new FullTextIndexEventListener()); _configuration.SetListener(ListenerType.PostInsert, new FullTextIndexEventListener()); _configuration.SetListener(ListenerType.PostDelete, new FullTextIndexEventListener()); SearchFactoryImpl.GetSearchFactory(_configuration);

Esto crea los huesos de un índice, pero no es visible con Luke, que me dice que está dañado.

También utilicé el siguiente código para intentar crear el índice manualmente, pero nuevamente solo crea el archivo de segmentos, nada más

public void CreateIndex<T>(string rootIndexDirectory) { Type type = typeof (T); var info = new DirectoryInfo(Path.Combine(rootIndexDirectory, type.Name)); // Recursively delete the index and files in there if (info.Exists) info.Delete(true); // Now recreate the index FSDirectory dir = FSDirectory.GetDirectory(Path.Combine(rootIndexDirectory, type.Name), true); //Ioc.UrlProvider.MapPath(Path.Combine(rootIndexDirectory, type.Name)), true); try { var writer = new IndexWriter(dir, new StandardAnalyzer(), true); writer.Close(); } finally { if (dir != null) dir.Close(); } using (ISession session = _sessionFactory.OpenSession()) { using (IFullTextSession fullTextSession = Search.CreateFullTextSession(session)) { foreach (var contact in _contacts) { //session.Save(contact); fullTextSession.Index(contact); } } } }

Entonces mi pregunta es: ¿tengo que usar v1.1.4 de nHibernate si quiero usar nHibernate.Search? ¿O puedo usar v2? En ese caso, ¿qué estoy haciendo mal?

Hay muy poco en la web sobre esto.

¿Nadie?


He encontrado un ejemplo de trabajo aquí:

http://darioquintana.com.ar/blogging/?p=21

V2 nHibernate.Search.dll en este proyecto contiene un SearchFactory (aunque en un espacio de nombre diferente).

El que compilé desde el repositorio SVN no tiene esto

Entonces todo ordenado