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.

Другие вопросы по тегам