nHibernate.Cerca con nHibernate v2
-
06-07-2019 - |
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?
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