ASP.NET KB система / поисковая система - PullRequest
1 голос
/ 29 января 2010

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

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

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

1 Ответ

3 голосов
/ 29 января 2010

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

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

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

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

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

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

  • 'field': содержимое документа из db (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();
    }
    
...