2010-01-28 78 views
1

我們公司有一個「我的賬戶」,我們希望在這裏放置一個知識庫。我們有一個客戶關係管理系統,記錄幫助電話並將一些知識庫文章寫入數據庫。主要問題(相同的基本幫助電話)標有關鍵字。我們還爲我們銷售的軟件提供CHM幫助文件(一些用戶從未使用內部幫助系統,他們上線),PDF白皮書和教程位於受保護的目錄中。我希望購買或快速構建ASP.NET解決方案,用戶可以搜索數據庫以顯示幫助文章,還可以顯示教程,白皮書或CHM中的幫助文件。ASP.NET KB系統/搜索引擎

要求:它必須看起來像我們的網站。我有一個母版頁,所以任何內容頁面幾乎都是白色的......沒有圖形,顏色等。

有沒有人知道第三方搜索引擎,或者有關如何使用某些源代碼的示例Lucene.NET從現有的數據庫建立搜索索引數據庫?

回答

3

你可以用Lucene.Net構建這樣的解決方案。 將您的文檔保存在數據庫中(如已經)並使用您想要的Lucene.Net文檔編制索引。

Lucene將在文件系統中擁有自己的索引。

您需要在DB和Lucene索引中爲您的文檔提供同步,因此當DB中的文檔發生更改時,您需要使用Lucene重新索引它。 同步(DB和Lucene索引之間的匹配)可以基於來自DB的某個唯一鍵值(例如:ID)。

所以,當你想向Lucene索引添加一些文檔時,你需要索引文檔內容(你不需要在Lucene中保存內容)並使用DB中的唯一鍵值將其保存到Lucene中ID)。

然後您可以搜索Lucene索引並獲取匹配文檔ID的列表。 並通過這些ID從您的數據庫中檢索它們並向用戶顯示。

以下是我的項目的示例方法,它將文檔添加到Lucene索引。 方法參數中的InformationAsset是來自數據庫的文檔,我想索引。 這種方法與創建「Lucene的文檔」幾「域」:

  • 「場」:從數據庫中的文檔的內容(InformationAsset從方法參數)
  • 「fieldId」:這是從數據庫中InformationAsset的ID ,以匹配數據庫和Lucene索引
  • 'fieldPubDate':發佈日期,我可以基於所有字段創建高級查詢到Lucene引擎。
  • 'fieldDataSource':它是某種類別。

    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

我認爲,同樣的邏輯也將工作,但我們不存儲在文檔中的CRM數據庫中,我們存儲文本,看起來像一篇文章的描述字段,但我可以拉說出來的如果它是一個文檔。謝謝! – Marsharks 2010-01-28 22:50:07