NHibernate Search Lucene.NET SearchFactory является нулевым - PullRequest
2 голосов
/ 06 января 2011

Я уже несколько часов бьюсь над следующей проблемой.Я пробовал это с разными сборками 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, хотя понятия не имею, что с ним делать ...

Может быть, я что-то упустил?Любая помощь очень ценится.

1 Ответ

1 голос
/ 13 января 2011

Хм, похоже, Ninject как-то с этим связан. Не уверен, почему / как. У меня есть рабочее решение с NH 3.0.1.4000 + Search + Lucene 2.9.2.2, если интересно, отправьте мне письмо.

http://ceesplug.nl/LuceneNHibernateTest.rar

Полное решение, работающее для NHibernate с FluentNHibernate и без него.

...