Pergunta

Eu tendo problemas para obter nHibernate.Search para criar um índice.

Se eu usar 1.2.1.4 do nHibernate.dll & nHibernate.Search.dll então o índice é criado corretamente e posso inspecioná-lo com Luke (um utilitário Lucene). Um arquivo de segmentos é criada, bem como um arquivo Fragmentos etc

No entanto, quando eu uso v 2 de nHibernate.dll & nHibernate.Search.dll seguida, o índice não é criado corretamente. Apenas um arquivo 1k segmentos é criado no diretório Index e Lucas não é capaz de inspecioná-lo.

O código que usei em v1 foi o seguinte:

_configuration = new Configuration();
_configuration.Configure();
_configuration.AddAssembly(typeof (Contact).Assembly);
_sessionFactory = _configuration.BuildSessionFactory();
SearchFactory.Initialize(_configuration, _sessionFactory);

e eu tenho o seguinte no arquivo de configuração

<property name="hibernate.search.default.directory_provider">NHibernate.Search.Storage.FSDirectoryProvider, NHibernate.Search</property>
<property name="hibernate.search.default.indexBase">~/Index</property>

na versão 2 não há SearchFactory. A única coisa semelhante que eu poderia encontrar era

SearchFactoryImpl.GetSearchFactory(_configuration);

Então, eu configurei a configuração da seguinte maneira

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

Isso cria o esqueleto de um índice, mas não é visível com Luke - que me diz que é corrupto

Eu também tenho usado o seguinte código para tentar criar o índice manualmente, mas novamente ele só cria o arquivo segmentos, nada mais

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

Assim, a minha pergunta é - eu tenho que uso v1.1.4 de nHibernate se eu quiser usar nHibernate.Search? Ou posso usar v2? Caso em que o que estou fazendo de errado?

Há muito pouco na web sobre isso.

Qualquer um?

Foi útil?

Solução

Eu encontrei um exemplo de trabalho aqui:

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

O v2 nHibernate.Search.dll neste projecto contém uma SearchFactory (embora em um namespace diferente).

O que eu compilado a partir do does not repositório SVN tem esse

Assim, todos Ordenar

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top