nHibernate.Search с nHibernate v2 - PullRequest
       26

nHibernate.Search с nHibernate v2

3 голосов
/ 09 января 2009

У меня проблемы с получением nHibernate.Search для создания индекса.

Если я использую 1.2.1.4 файла nHibernate.dll & nHibernate.Search.dll, тогда индекс создается правильно, и я могу проверить его с помощью Luke (утилита Lucene). Создается файл сегментов, а также файл фрагментов и т. Д.

Однако, когда я использую v 2 из nHibernate.dll и nHibernate.Search.dll, индекс создается неправильно. В каталоге Index создается только файл с сегментами 1 Кб, и Люк не может его проверить.

Код, который я использовал в 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);

Это создает оголенные части Индекса, но его нельзя просмотреть с помощью Люка - что говорит мне, что оно повреждено

Я также использовал следующий код, чтобы попытаться создать индекс вручную, но опять же он создает только файл сегментов, ничего больше

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);
            }
        }
    }
}

Так что мой вопрос - нужно ли использовать vH.1.1.4 nHibernate, если я хочу использовать nHibernate.Search? Или я могу использовать v2? В каком случае что я делаю не так?

В Интернете об этом очень мало.

Любой

1 Ответ

2 голосов
/ 09 января 2009

Я нашел рабочий пример здесь:

http://darioquintana.com.ar/blogging/?p=21

v2 nHibernate.Search.dll в этом проекте содержит SearchFactory (хотя и в другом пространстве имен).

Тот, который я скомпилировал из репозитория SVN, не имеет этого

Так что все отсортировано

...