Pregunta

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

Si uso 1.2.1.4 de nHibernate.dll & amp; nHibernate.Search.dll luego 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 & amp; nHibernate.Search.dll, entonces 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 usé 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 básicos de un índice, pero Luke no lo puede ver, lo que me dice que está corrupto

También he usado 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 cuyo caso, ¿qué estoy haciendo mal?

Hay muy poco en la web sobre esto.

¿Alguien?

¿Fue útil?

Solución

He encontrado un ejemplo de trabajo aquí:

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

El v2 nHibernate.Search.dll en este proyecto contiene un SearchFactory (aunque en un espacio de nombres diferente).

El que compilé del repositorio SVN no tiene esto

Entonces todo ordenado

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top