Я уже несколько часов бьюсь над следующей проблемой.Я пробовал это с разными сборками NHibernate / NHibernate.Search (3.0.0.4 / 2.1.2), все они приводят к одной и той же ошибке.Используемая версия Lucene: 2.9.2.2
Все они скомпилированы из исходного кода.NHibernate настроен на использование поиска NHibernate, настройка выполняется через Fluent NHibernate.
FluentConfiguration fc = Fluently.Configure()
. (mappings, db config, etc.)
.ExposeConfiguration
(
cfg =>
{
cfg.SetProperty("hibernate.search.default.directory_provider", typeof(FSDirectoryProvider).AssemblyQualifiedName);
cfg.SetProperty("hibernate.search.default.indexBase", "~/Index");
cfg.SetProperty("hibernate.search.default.indexBase.create", "true");
cfg.SetListener(NHibernate.Event.ListenerType.PostUpdate, new FullTextIndexEventListener());
cfg.SetListener(NHibernate.Event.ListenerType.PostInsert, new FullTextIndexEventListener());
cfg.SetListener(NHibernate.Event.ListenerType.PostDelete, new FullTextIndexEventListener());
}
);
Пока все хорошо, индекс создается в каталоге Index в папке bin (файлы plot.gen & сегменты_1).
После того, как конфигурация была создана, я выбираю сессию NHibernate и пытаюсь что-то проиндексировать:
var _session = _factory.OpenSession();
using (ITransaction tx = _session.BeginTransaction())
{
var fts = Search.CreateFullTextSession(_session);
fts.PurgeAll(typeof(User));
var coll = fts.CreateCriteria<User>().List<User>();
foreach (var item in coll)
{
fts.Index(item);
}
tx.Commit();
}
Это нормально, пока не будет достигнут fts.PurgeAll или fts.Index, что дает эту ошибку:
Object reference not set to an instance of an object.
Line 602: // TODO: Cache that at the FTSession level
Line 603: // not strictly necesary but a small optmization
Line 604: DocumentBuilder builder = searchFactoryImplementor.DocumentBuilders[clazz];
Line 605: if (builder != null)
Line 606: {
Эта ошибка выдается из NHiberate.Search.dll, похоже, SearchFactory не был инициализирован.Код, который должен создать SearchFactory, возвращает null:
if (searchFactory == null)
{
searchFactory = ContextHelper.GetSearchFactory(session);
}
Обнаружил несколько возможных решений, в которых мне нужно инициализировать SearchFactory с помощью SearchFactory.Initialize, но в моем (2.0 / 3.0) NHibernate такого метода не существует.Поиск сборок.
NHibernate.Search.Search.CreateFullTextSession(_session)
.CreateFullTextQuery<User>("Firstname:Cees").List<User>();
Также выдает «нулевое исключение» (конечно), выше вызываются:
IDictionary<System.Type, DocumentBuilder> builders = searchFactory.DocumentBuilders;
Где searchFactory == null
Естьa SearchFactoryImpl
SearchFactoryImpl searchFactory = NHibernate.Search.Impl.SearchFactoryImpl.GetSearchFactory(config);
Которые возвращают экземпляр SearchFactoryImpl, хотя понятия не имею, что с ним делать ...
Может быть, я что-то упустил?Любая помощь очень ценится.