2010-01-28 5 views
1

Notre société a un "MyAccount" où nous aimerions mettre une base de connaissances derrière. Nous avons un système CRM où les appels d'aide sont enregistrés et certains articles de la base de connaissances sont écrits dans la base de données. Le problème principal (même appel d'aide de base) est marqué avec un mot-clé. Nous avons également des fichiers d'aide CHM pour les logiciels que nous vendons (certains utilisateurs n'utilisent jamais le système d'aide interne, ils vont en ligne), des whitepapers PDF et des tutoriels dans un répertoire protégé. Je voudrais soit acheter, soit créer rapidement une solution ASP.NET dans laquelle un utilisateur peut rechercher dans la base de données pour afficher l'article d'aide et également afficher des tutoriels ou des livres blancs ou un fichier d'aide du CHM.ASP.NET KB système/moteur de recherche

Exigences: Il doit ressembler à notre site web. J'ai une page maître, donc toute page de contenu doit être à peu près blanche ... pas de graphiques, couleurs, etc.

Est-ce que quelqu'un connaît un moteur de recherche tiers, ou un exemple avec un code source sur la façon d'utiliser Lucene.NET pour créer une base de données d'index de recherche à partir d'une base de données existante?

Répondre

3

Vous pouvez créer une telle solution avec Lucene .Net. Conservez vos documents dans la base de données (comme déjà) et indexez avec les documents Lucene.Net que vous voulez. Lucene aura son propre index dans le système de fichiers.

Vous devez fournir une synchronisation entre vos documents dans DB et l'index Lucene, donc lorsque le document dans la base de données change, vous devez le réindexer avec Lucene. La synchronisation (correspondance entre l'index DB et Lucene) peut être basée sur une valeur de clé unique de DB (ex: ID). Donc, quand vous voulez ajouter un document à l'index Lucene, vous indexez le contenu du document (vous n'avez pas besoin d'enregistrer le contenu dans Lucene) et vous le sauvegardez dans Lucene avec une valeur de clé unique de DB (disons ID).

Ensuite, vous pouvez rechercher l'index Lucene et obtenir la liste des ID de document correspondant. Et récupérez-les de votre base de données par ces ID et montrez-les à l'utilisateur. Ci-dessous est la méthode d'exemple de mon projet, il ajoute le document à l'index de Lucene. InformationAsset dans l'argument de méthode est le document de DB que je veux indexer. Cette méthode crée 'Lucene document' avec quelques 'champs':

  • 'champ': le contenu de la doc de db (InformationAsset de l'argument de la méthode)
  • 'FieldID': il est ID de la InformationAsset base de données Pour correspondre à l'index de base de données et Lucene
  • 'fieldPubDate': date de publication, je peux créer des requêtes avancées au moteur Lucene en se basant sur tous les champs.
  • 'fieldDataSource': c'est une sorte de catégorie.

    public void AddToIndex(Entities.InformationAsset infAsset, IList<Keyword> additionalKeywords) 
    { 
        Analyzer analyzer = new StandardAnalyzer(); 
    
        IndexWriter indexWriter = new IndexWriter(LuceneDir, analyzer, false); 
    
        Document doc = new Document(); 
    
        // string z dodatkowymi slowami po ktorych ma byc tez zindeksowana tresc 
        string addKeysStr = ""; 
        if(additionalKeywords != null) 
        { 
         foreach (Keyword keyword in additionalKeywords) 
         { 
          addKeysStr += " " + keyword.Value; 
         } 
        } 
        addKeysStr += " " + m_RootKeyword; 
    
        string contentStr; 
        contentStr = infAsset.Title + " " + infAsset.Content + addKeysStr; 
    
        // indeksacja pola z trescia 
        Field field = new Field(LuceneFieldName.Content, contentStr, Field.Store.NO, Field.Index.TOKENIZED, 
              Field.TermVector.YES); 
        // pole z Id 
        Field fieldId = new Field(LuceneFieldName.Id, infAsset.Id.ToString(), Field.Store.YES, Field.Index.UN_TOKENIZED); 
    
        // pole publish date 
        Field fieldPubDate = new Field(LuceneFieldName.PublishDate, 
                DateTools.DateToString(infAsset.PublishingDate, DateTools.Resolution.MINUTE), 
                Field.Store.YES, Field.Index.NO_NORMS, Field.TermVector.YES); 
    
        // pole DataSource 
        // pole z Id 
        Field fieldDataSource = new Field(LuceneFieldName.DataSourceId, infAsset.DataSource.Id.ToString(), Field.Store.YES, 
                 Field.Index.UN_TOKENIZED); 
    
        doc.Add(field); 
        doc.Add(fieldId); 
        doc.Add(fieldPubDate); 
        doc.Add(fieldDataSource); 
    
        doc.SetBoost((float)CalculateDocBoostForInfAsset(infAsset)); 
    
        indexWriter.AddDocument(doc); 
    
        indexWriter.Optimize(); 
        indexWriter.Close(); 
    } 
    
+0

Je pense que même logique va fonctionner, sauf que nous ne stockons pas un document dans la base de données CRM, nous stockons le texte dans un champ de description qui ressemble à un article, mais je ne peux tirer que comme si c'était un doc. Merci! – Marsharks

Questions connexes