2009-12-29 4 views
2

Est-ce que quelqu'un a réussi à faire fonctionner nhibernate.search (Lucene) avec S # architecture arp? Je pense que tout est correctement câblé, sauf que Luke ne montre aucun enregistrement ou index quand j'exécute ma méthode d'indexation. Les fichiers d'index pour l'entité sont créés (segments.gen & segments_1) mais les deux ont une taille de 1 Ko, ce qui explique pourquoi Luke ne montre aucune donnée.NHibernate.Recherche avec architecture S # arp

Je n'exécute aucun autre code spécifique pour faire fonctionner la recherche, ai-je manqué quelques appels d'initialisation? Je suppose que les auditeurs sont automatiquement pris en charge par nhibernate.

Dans mon projet Web je:

NHibernate.config

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 
    <session-factory> 
    <property name="connection.connection_string">Data Source=.\SQLEXPRESS;Database=MyDatabase;Integrated Security=True;</property> 
    <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property> 
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property> 
    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property> 
    <property name="show_sql">true</property> 
    <property name="generate_statistics">true</property> 
    <property name="connection.release_mode">auto</property> 
    <property name="adonet.batch_size">500</property> 
    <property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property> 

    <listener class='NHibernate.Search.Event.FullTextIndexEventListener, NHibernate.Search' type='post-insert'/> 
    <listener class='NHibernate.Search.Event.FullTextIndexEventListener, NHibernate.Search' type='post-update'/> 
    <listener class='NHibernate.Search.Event.FullTextIndexEventListener, NHibernate.Search' type='post-delete'/> 
    </session-factory> 
</hibernate-configuration> 

Web.Config

<configSections> 
    ... 
    <section name="nhs-configuration" type="NHibernate.Search.Cfg.ConfigurationSectionHandler, NHibernate.Search" requirePermission="false" /> 
</configSections> 

<nhs-configuration xmlns='urn:nhs-configuration-1.0'> 
    <search-factory> 
    <property name="hibernate.search.default.directory_provider">NHibernate.Search.Store.FSDirectoryProvider, NHibernate.Search</property> 
    <property name="hibernate.search.default.indexBase">~\Lucene</property> 
    </search-factory> 
</nhs-configuration> 

Mon entité est décorée comme suit:

[Indexed(Index = "Posting")] 
public class Posting : Entity 
{ 
    [DocumentId] 
    public new virtual int Id 
    { 
     get { return base.Id; } 
     protected set { base.Id = value; } 
    } 

    [Field(Index.Tokenized, Store = Store.Yes)] 
    [Analyzer(typeof(StandardAnalyzer))] 
    public virtual string Title { get; set; } 

    [Field(Index.Tokenized, Store = Store.Yes)] 
    [Analyzer(typeof(StandardAnalyzer))] 
    public virtual string Description { get; set; } 

    public virtual DateTime CreatedDate { get; set; } 
    ... 
} 

Et j'exécutez la commande suivante pour créer l'index

public void BuildSearchIndex() 
{ 
    FSDirectory directory = null; 
    IndexWriter writer = null; 

    var type = typeof(Posting); 

    var info = new DirectoryInfo(GetIndexDirectory()); 

    if (info.Exists) 
    { 
     info.Delete(true); 
    } 

    try 
    { 
     directory = FSDirectory.GetDirectory(Path.Combine(info.FullName, type.Name), true); 
     writer = new IndexWriter(directory, new StandardAnalyzer(), true); 
    } 
    finally 
    { 
     if (directory != null) 
     { 
      directory.Close(); 
     } 

     if (writer != null) 
     { 
      writer.Close(); 
     } 
    } 

    var fullTextSession = Search.CreateFullTextSession(this.Session); 

    // select all Posting objects from NHibernate and add them to the Lucene index 
    foreach (var instance in Session.CreateCriteria(typeof(Posting)).List<Posting>()) 
    { 
     fullTextSession.Index(instance); 
    } 
} 

private static string GetIndexDirectory() 
{ 
    var nhsConfigCollection = CfgHelper.LoadConfiguration(); 
    var property = nhsConfigCollection.DefaultConfiguration.Properties["hibernate.search.default.indexBase"]; 
    var fi = new FileInfo(property); 
    return Path.Combine(AppDomain.CurrentDomain.BaseDirectory, fi.Name); 
} 

Répondre

0

Jordan, utilisez-vous les derniers morceaux de NHContrib pour NHibernate.Search? J'ai récemment mis à jour mes morceaux et je suis dans la même situation que vous. Cela fonctionne pour moi sur des morceaux plus anciens, à partir de juillet. Mais je ne peux pas obtenir mes index pour créer non plus. Votre config regarde bien, même que le mien. Et votre méthode d'indexation semble bonne aussi.

+0

Ouais c'est de la dernière source de Contrib. Juste commencé juste sur ceci les jours avant Noël n'ont donc pas travaillé avec une source plus ancienne. – Jordan

+0

Je travaille également sur ce problème, je publierai des nouvelles si je trouve une solution. –

+0

J'ai eu le mien pour travailler, pour moi c'était un problème avec un de mes champs que j'avais indexé en lançant une exception quand NH Search/lucene a essayé d'y accéder. –

1

J'ai trouvé une réponse à ma question, ici c'est au cas où quelqu'un d'autre viendrait par ce problème.

configuration NHS dans web.config contenait ces lignes:

<property name="hibernate.search.default.directory_provider">NHibernate.Search.Store.FSDirectoryProvider, NHibernate.Search</property> 
<property name="hibernate.search.default.indexBase">~\SearchIndex</property> 

La première ligne doit être supprimée car dans ce cas NHS considèrent comme si les actions de l'indice. Il est connu problème NHibernateSearch.

Si le site est exécuté à partir d'IIS, le service réseau doit disposer de toutes les autorisations sur le répertoire d'index de recherche.

0

Jordan, il existe maintenant une alternative au mappage Lucene.NET basé sur les attributs, appelé FluentNHibernate.Search, ce projet est hébergé sur codeplex.

http://fnhsearch.codeplex.com/

public class BookSearchMap : DocumentMap<Book> 
{ 
    public BookSearchMap() 
    { 
     Id(p => p.BookId).Field("BookId").Bridge().Guid(); 
     Name("Book"); 
     Boost(500); 
     Analyzer<StandardAnalyzer>(); 

     Map(x => x.Title) 
      .Analyzer<StandardAnalyzer>() 
      .Boost(500); 

     Map(x => x.Description) 
      .Boost(500) 
      .Name("Description") 
      .Store().Yes() 
      .Index().Tokenized(); 
    } 
} 
+0

Comment avez-vous obtenu la configuration de fluentnhibernate.search pour travailler avec l'architecture pointue? – Sugendran

Questions connexes