2

几个小时以来,我一直在努力解决以下问题。我尝试使用不同的 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());
                }
            );

到目前为止一切顺利,在 bin 文件夹(segments.gen 和segments_1 文件)的Index 目录中创建了一个索引。

创建配置后,我获取 NHibernate Session 并尝试索引某些内容:

        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:                {

这个错误是从 NIBerate.Search.dll 引发的,看起来 SearchFactory 没有被初始化。应该创建 SearchFactory 的代码返回 null:

            if (searchFactory == null)
            {
                searchFactory = ContextHelper.GetSearchFactory(session);
            }

遇到了几种可能的解决方案,我需要使用 SearchFactory.Initialize 初始化 SearchFactory,但我的 (2.0 / 3.0) NHibernate.Search 程序集中不存在这种方法。

NHibernate.Search.Search.CreateFullTextSession(_session)
            .CreateFullTextQuery<User>("Firstname:Cees").List<User>();

也抛出一个“空异常”(当然),上面是调用:

IDictionary<System.Type, DocumentBuilder> builders = searchFactory.DocumentBuilders;

其中 searchFactory == null

有一个 SearchFactoryImpl

SearchFactoryImpl searchFactory = NHibernate.Search.Impl.SearchFactoryImpl.GetSearchFactory(config);

它返回一个 SearchFactoryImpl 实例,但不知道如何处理它......

也许我错过了什么?任何帮助深表感谢。

4

1 回答 1

1

嗯,似乎与Ninject有关。不知道为什么/如何。我有一个使用 NH 3.0.1.4000 + Search + Lucene 2.9.2.2 的工作解决方案,如果有兴趣,请给我发电子邮件。

http://ceesplug.nl/LuceneNHibernateTest.rar

完整的解决方案,适用于有和没有 FluentNHibernate 的 NHibernate。

于 2011-01-13T09:29:19.443 回答