Domanda

Ho problemi a trovare nHibernate. Cerca di creare un indice.

Se utilizzo 1.2.1.4 di nHibernate.dll e amp; nHibernate.Search.dll quindi l'indice viene creato correttamente e posso esaminarlo con Luke (un'utilità Lucene). Viene creato un file di segmenti, un file di frammenti ecc.

Tuttavia, quando uso la v 2 di nHibernate.dll & amp; nHibernate.Search.dll quindi l'indice non viene creato correttamente. Nella directory dell'indice viene creato solo un file di segmenti 1k e Luke non è in grado di ispezionarlo.

Il codice che ho usato in v1 era il seguente:

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

e ho il seguente nel file di configurazione

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

nella versione 2 non c'è SearchFactory. L'unica cosa simile che ho trovato è stata

SearchFactoryImpl.GetSearchFactory(_configuration);

Quindi ho impostato la configurazione come segue

_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);

Questo crea le ossa nude di un indice ma non è visualizzabile con Luke - il che mi dice che è corrotto

Ho anche usato il seguente codice per provare a creare manualmente l'indice, ma di nuovo crea solo il file dei segmenti, nient'altro

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);
            }
        }
    }
}

Quindi la mia domanda è: devo usare v1.1.4 di nHibernate se voglio usare nHibernate.Search? O posso usare v2? In tal caso cosa sto sbagliando?

C'è molto poco sul web al riguardo.

Chiunque?

È stato utile?

Soluzione

Ho trovato un esempio funzionante qui:

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

Il v2 nHibernate.Search.dll in questo progetto contiene un SearchFactory (sebbene in uno spazio dei nomi diverso).

Quello che ho compilato dal repository SVN non ha questo

Quindi tutti ordinati

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top