NHibernate Search Lucene.NET SearchFactory является нулевым
Я боролся со следующей проблемой в течение нескольких часов. Я пробовал это с разными сборками NHibernate/NHibernate.Search (3.0.0.4 / 2.1.2), все они приводят к одной и той же ошибке. Используемая версия Lucene: 2.9.2.2
Все они собраны из источника. NHibernate настроен для использования NHibernate Search, конфигурация проходит через 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 (файлы columns.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, но в моих сборках NHibernate.Search (2.0 / 3.0) такого метода не существует.
NHibernate.Search.Search.CreateFullTextSession(_session)
.CreateFullTextQuery<User>("Firstname:Cees").List<User>();
Также выдает "нулевое исключение" (конечно), выше - вызов:
IDictionary<System.Type, DocumentBuilder> builders = searchFactory.DocumentBuilders;
Где searchFactory == ноль
Есть SearchFactoryImpl
SearchFactoryImpl searchFactory = NHibernate.Search.Impl.SearchFactoryImpl.GetSearchFactory(config);
Которые возвращают экземпляр SearchFactoryImpl, хотя понятия не имею, что с ним делать...
Может я что-то упустил? Буду признателен за любую оказанную помощь.
1 ответ
Хм, похоже, Ninject как-то связан с этим. Не уверен, почему / как. У меня есть рабочее решение с NH 3.0.1.4000 + Search + Lucene 2.9.2.2, если интересно, пришлите мне письмо.
http://ceesplug.nl/LuceneNHibernateTest.rar
Полное решение, работающее для NHibernate с и без FluentNHibernate.