我几个小时以来一直在努力解决以下问题。我尝试使用不同的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会话并尝试索引:
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.Initialize初始化SearchFactory,但我的(2.0 / 3.0)NHibernate.Search程序集中不存在这样的方法。
NHibernate.Search.Search.CreateFullTextSession(_session)
.CreateFullTextQuery<User>("Firstname:Cees").List<User>();
还抛出'null exception'(当然),上面是调用:
IDictionary<System.Type, DocumentBuilder> builders = searchFactory.DocumentBuilders;
其中searchFactory == null
有一个SearchFactoryImpl
SearchFactoryImpl searchFactory = NHibernate.Search.Impl.SearchFactoryImpl.GetSearchFactory(config);
哪个返回一个SearchFactoryImpl实例,不知道该怎么办呢......
也许我错过了什么?非常感谢任何帮助。
答案 0 :(得分:1)
http://ceesplug.nl/LuceneNHibernateTest.rar
完整的解决方案,适用于使用和不使用FluentNHibernate的NHibernate。