nHibernate.Поиск с помощью nHibernate v2
-
06-07-2019 - |
Вопрос
У меня возникли проблемы с получением nHibernate.Search для создания индекса.
Если я использую nHibernate.dll и nHibernate.Search.dll версии 1.2.1.4, индекс создается правильно, и я могу проверить его с помощью Luke (утилита Lucene).Создается файл сегментов, а также файл фрагментов и т. д.
Однако когда я использую версию 2 nHibernate.dll и nHibernate.Search.dll, индекс создается неправильно.В каталоге Index создается только файл размером 1 тыс. сегментов, и Люк не может его проверить.
Код, который я использовал в v1, был следующим:
_configuration = new Configuration();
_configuration.Configure();
_configuration.AddAssembly(typeof (Contact).Assembly);
_sessionFactory = _configuration.BuildSessionFactory();
SearchFactory.Initialize(_configuration, _sessionFactory);
и у меня есть следующее в файле конфигурации
<property name="hibernate.search.default.directory_provider">NHibernate.Search.Storage.FSDirectoryProvider, NHibernate.Search</property>
<property name="hibernate.search.default.indexBase">~/Index</property>
в версии 2 нет SearchFactory.Единственное похожее, что я смог найти, это
SearchFactoryImpl.GetSearchFactory(_configuration);
Итак, я настроил конфигурацию следующим образом
_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);
Это создает основу индекса, но его нельзя просмотреть с помощью Люка, что говорит мне о том, что он поврежден.
Я также использовал следующий код, чтобы попытаться создать индекс вручную, но опять же он создает только файл сегментов и ничего больше.
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);
}
}
}
}
Итак, мой вопрос: нужно ли мне использовать nHibernate v1.1.4, если я хочу использовать nHibernate.Search?Или я могу использовать v2?В каком случае что я делаю не так?
В сети об этом очень мало.
Любой?
Решение
Я нашел рабочий пример здесь:
http://darioquintana.com.ar/blogging/?p=21
nHibernate.Search.dll v2 в этом проекте содержит SearchFactory (хотя и в другом пространстве имен).
Тот, который я скомпилировал из репозитория SVN, не имеет этого.
Итак, все в порядке