3

J'ai du mal à obtenir nHibernate.Search pour créer un index. Si j'utilise 1.2.1.4 de nHibernate.dll & nHibernate.Search.dll alors l'index est créé correctement et je peux l'inspecter avec Luke (un utilitaire Lucene). Un fichier de segments est créé ainsi qu'un fichier Fragments etcnHibernate.Recherche avec nHibernate v2

Cependant, quand j'utilise v 2 nHibernate.dll & nHibernate.Search.dll alors l'index ne se crée pas correctement. Seul un fichier de segments 1k est créé dans le répertoire Index et Luke ne peut pas l'inspecter.

Le code je en v1 était la suivante:

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

et je le suivais dans le fichier de configuration

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

dans la version 2 il n'y a pas SearchFactory. La seule chose similaire que je pouvais trouver était

SearchFactoryImpl.GetSearchFactory(_configuration); 

J'ai donc mis en place la configuration comme suit

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

Cela crée les os nus d'un indice, mais il n'est pas visible avec Luke - qui me dit il est corrompu

J'ai aussi utilisé le code suivant pour essayer de créer l'index manuellement, mais encore une fois, il ne crée que le fichier segments, rien d'autre

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

Donc ma question est - dois-je utiliser v1.1.4 de nHibernate si je veux utiliser nHibernate.Search? Ou puis-je utiliser v2? Dans ce cas, qu'est-ce que je fais de mal?

Il y a très peu de choses sur le web à ce sujet.

Quelqu'un?

+0

triés Quelqu'un s'il vous plaît changer le titre nhibrnate à NHibernate – Cherian

Répondre

2

J'ai trouvé un exemple de travail ici:

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

Le nHibernate.Search.dll v2 dans ce projet ne contient une SearchFactory (quoique dans un autre espace de noms).

Celui que je compilé à partir du doesnt dépôt SVN ont cette

Donc

+0

bon mec de travail. Merci! – andy