我在获取nHibernate.Search来创建索引时遇到了麻烦。
如果我使用nHibernate.dll和nHibernate.Search.dll的1.2.1.4,则可以正确创建索引,并且可以使用Luke(Lucene实用程序)对其进行检查。创建了一个segments文件以及一个Fragments文件等
但是,当我使用nHibernate.dll和nHibernate.Search.dll的v 2时,索引创建不正确。在索引目录中仅创建了一个1k段文件,Luke无法对其进行检查。
我在v1中使用的代码如下:
_configuration = new Configuration(); _configuration.Configure(); _configuration.AddAssembly(typeof (Contact).Assembly); _sessionFactory = _configuration.BuildSessionFactory(); SearchFactory.Initialize(_configuration, _sessionFactory);
而且我在配置文件中有以下内容
<property name="hibernate.search.default.directory_provider">NHibernate.Search.Storage.FSDirectoryProvider, NHibernate.Search</property> <property name="hibernate.search.default.indexBase">~/Index</property>
在版本2中,没有SearchFactory。我能找到的唯一类似的东西是
SearchFactoryImpl.GetSearchFactory(_configuration);
所以我如下设置了配置
_configuration = new Configuration(); _configuration.Configure(); _configuration.AddAssembly(typeof (Contact).Assembly); _sessionFactory = _configuration.BuildSessionFactory(); _configuration.SetProperty("hibernate.search.default.directory_provider", "NHibernate.Search.Store.FSDirectoryProvider, NHibernate.Search"); _configuration.SetProperty("hibernate.search.default.indexBase", "Index"); _configuration.SetProperty("hibernate.search.analyzer", "Lucene.Net.Analysis.Standard.StandardAnalyzer, Lucene.Net"); _configuration.SetListener(ListenerType.PostUpdate, new FullTextIndexEventListener()); _configuration.SetListener(ListenerType.PostInsert, new FullTextIndexEventListener()); _configuration.SetListener(ListenerType.PostDelete, new FullTextIndexEventListener()); SearchFactoryImpl.GetSearchFactory(_configuration);
这会创建索引的裸露骨骼,但Luke无法看到它-告诉我它已损坏
我还使用了以下代码来尝试手动创建索引,但是再次它仅创建了细分文件,除此之外
public void CreateIndex<T>(string rootIndexDirectory) { Type type = typeof (T); var info = new DirectoryInfo(Path.Combine(rootIndexDirectory, type.Name)); // Recursively delete the index and files in there if (info.Exists) info.Delete(true); // Now recreate the index FSDirectory dir = FSDirectory.GetDirectory(Path.Combine(rootIndexDirectory, type.Name), true); //Ioc.UrlProvider.MapPath(Path.Combine(rootIndexDirectory, type.Name)), true); try { var writer = new IndexWriter(dir, new StandardAnalyzer(), true); writer.Close(); } finally { if (dir != null) dir.Close(); } using (ISession session = _sessionFactory.OpenSession()) { using (IFullTextSession fullTextSession = Search.CreateFullTextSession(session)) { foreach (var contact in _contacts) { //session.Save(contact); fullTextSession.Index(contact); } } } }
所以我的问题是-如果要使用nHibernate.Search,是否必须使用nHibernate v1.1.4?还是可以使用v2?在哪种情况下我做错了什么?
网上很少有这件事。
任何人?
我在这里找到了一个可行的例子:
http://darioquintana.com.ar/blogging/?p=21
此项目中的v2 nHibernate.Search.dll确实包含SearchFactory(尽管在其他名称空间中)。
我从SVN储存库编译的那个没有这个
所以所有排序