nHibernate.Search com nHibernate v2
Estou tendo problemas para obter o nHibernate.Search para criar um índice.
Se eu usar o 1.2.1.4 do nHibernate.dll e nHibernate.Search.dll, o índice será criado corretamente e posso inspecioná-lo com Luke (um utilitário Lucene). Um arquivo de segmentos é criado, bem como um arquivo de fragmentos, etc.
No entanto, quando eu uso a v 2 do nHibernate.dll e nHibernate.Search.dll, o índice não é criado corretamente. Somente um arquivo de segmentos de 1k é criado no diretório Index e Luke não pode inspecioná-lo.
O código que usei na v1 era o seguinte:
_configuration = new Configuration();
_configuration.Configure();
_configuration.AddAssembly(typeof (Contact).Assembly);
_sessionFactory = _configuration.BuildSessionFactory();
SearchFactory.Initialize(_configuration, _sessionFactory);
e eu tenho o seguinte no arquivo de configuração
<property name="hibernate.search.default.directory_provider">NHibernate.Search.Storage.FSDirectoryProvider, NHibernate.Search</property>
<property name="hibernate.search.default.indexBase">~/Index</property>
na versão 2 não há SearchFactory. A única coisa semelhante que pude encontrar foi
SearchFactoryImpl.GetSearchFactory(_configuration);
Então, eu configurei a configuração da seguinte maneira
_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);
Isso cria os ossos básicos de um índice, mas não é visível com Luke - o que me diz que ele está corrompido
Também usei o código a seguir para tentar criar o índice manualmente, mas novamente ele cria apenas o arquivo de segmentos, nada mais
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);
}
}
}
}
Portanto, minha pergunta é: tenho que usar a v1.1.4 do nHibernate se quiser usar o nHibernate.Search? Ou posso usar a v2? Nesse caso, o que estou fazendo de errado?
Há muito pouco na web sobre isso.
Qualquer um?