Система ASP.NET KB / поисковая система

У нашей компании есть «MyAccount», где мы хотели бы разместить базу знаний. У нас есть CRM-система, в которой записываются обращения за помощью, а некоторые статьи из базы знаний записываются в базу данных. Основная проблема (тот же самый простой вызов помощи) помечается ключевыми словами. У нас также есть файлы справки CHM для программного обеспечения, которое мы продаем (некоторые пользователи никогда не используют внутреннюю справочную систему, они выходят в Интернет), технические документы и учебные пособия в формате PDF в защищенном каталоге. Я хотел бы либо купить, либо быстро создать решение ASP.NET, в котором пользователь может выполнять поиск в базе данных, чтобы отобразить справочную статью, а также показать учебные пособия, технические документы или файл справки из CHM.

Требования: Он должен быть похож на наш сайт. У меня есть мастер-страница, поэтому любая страница контента должна быть практически белой... без графики, цветов и т. д.

Кто-нибудь знает стороннюю поисковую систему или пример с некоторым исходным кодом о том, как использовать Lucene.NET для создания базы данных поискового индекса из существующей базы данных?


person Marsharks    schedule 28.01.2010    source источник


Ответы (1)


Вы можете создать такое решение с помощью Lucene .Net. Храните свои документы в базе данных (как уже было) и индексируйте документы Lucene.Net, которые вам нужны.

Lucene будет иметь свой собственный индекс в файловой системе.

Вам необходимо обеспечить синхронизацию между вашими документами в БД и индексом Lucene, поэтому при изменении документа в БД вам необходимо переиндексировать его с помощью Lucene. Синхронизация (соответствие между БД и индексом Lucene) может быть основана на некотором уникальном значении ключа из БД (например, ID).

Итак, когда вы хотите добавить какой-либо документ в индекс Lucene, вы индексируете содержимое документа (вам не нужно сохранять содержимое в Lucene) и «сохраняете» его в Lucene с уникальным значением ключа из БД (скажем, ID).

Затем вы можете выполнить поиск в индексе Lucene и получить список соответствующих идентификаторов документов. И извлеките их из своей БД по этим идентификаторам и покажите пользователю.

Ниже приведен пример метода из моего проекта, он добавляет документ в индекс Lucene. InformationAsset в аргументе метода — это документ из БД, который я хочу проиндексировать. Этот метод создает «документ Lucene» с несколькими «полями»:

  • 'поле': содержимое документа из базы данных (InformationAsset из аргумента метода)
  • 'fieldId': это идентификатор информационного объекта из базы данных, чтобы соответствовать базе данных и индексу 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();
    }
    
person Tomasz Modelski    schedule 28.01.2010
comment
Я думаю, что та же логика будет работать, за исключением того, что мы не храним документ в базе данных CRM, мы храним текст в поле описания, которое выглядит как статья, но я могу извлечь его, как если бы это был документ. Спасибо! - person Marsharks; 29.01.2010