Запись Инвертированного индекса в C# для приложения информационного поиска

Я пишу внутреннее приложение, которое содержит несколько частей информации о тексте, а также много частей данных об этих частях текста. Эти части данных будут сохранены в базе данных (SQL Server, хотя это могло измениться) в порядке записи.

Я хотел бы смочь искать самое соответствующее из этих сведений с самым соответствующим из них, чтобы быть наверху. Я первоначально изучил использование Полнотекстового поиска SQL Server, но это не столь гибко для моих других потребностей, как я надеялся, таким образом, кажется, что я должен буду разработать свое собственное решение этого.

Из того, что я понимаю то, что необходимо, инвертированный индекс, затем для содержания упомянутого инвертированного индекса, который будет восстановлен и изменен на основе результатов содержимой дополнительной информации (хотя на данный момент это может быть оставлено для более поздней даты, поскольку я просто хочу, чтобы инвертированный индекс индексировал основной текст от таблицы базы данных / обеспеченные строки).

У меня была трещина при написании этого кода в Java с помощью Хеш-таблицы с ключом как слова и значение как список случаев слова, но во всей честности я являюсь все еще довольно новым в C# и только действительно использовал вещи как DataSets и DataTables при обработке информации. Если требуется я загружу код Java скоро, после того как я очистил этот ноутбук вирусов.

Если данный ряд записей от таблицы или из Списка Строк, как можно было создать инвертированный индекс в C#, который предпочтительно сохранит в Набор данных/Таблицу данных?

Править: Я забыл упоминать, что я уже попробовал Lucene и Nutch, но требую моего собственного решения, поскольку изменение Lucene для удовлетворения моих потребностей взяло бы намного дольше, чем запись инвертированного индекса. Я буду обрабатывать много метаданных, этому также будет нужна обработка, после того как основной инвертированный индекс завершается, таким образом, все, чего я требую на данный момент, является основным полнотекстовым поиском на одной области с помощью инвертированного индекса. Наконец, работа над инвертированным индексом не что-то, что я получаю для делания каждый день, таким образом, было бы замечательно иметь трещину в нем.

8
задан Calum 29 March 2014 в 00:11
поделиться

3 ответа

Вот грубый обзор подхода, который я успешно использовал в C # в прошлом:

 struct WordInfo
 {
     public int position;
     public int fieldID;
 }

 Dictionary<string,List<WordInfo>> invertedIndex=new Dictionary<string,List<WordInfo>>();

       public void BuildIndex()
       {
            foreach (int  fieldID in GetDatabaseFieldIDS())
            {    
                string textField=GetDatabaseTextFieldForID(fieldID);

                string word;

                int position=0;

                while(GetNextWord(textField,out word,ref position)==true)
                {
                     WordInfo wi=new WordInfo();

                     if (invertedIndex.TryGetValue(word,out wi)==false)
                     {
                         invertedIndex.Add(word,new List<WordInfo>());
                     }

                     wi.Position=position;
                     wi.fieldID=fieldID;
                     invertedIndex[word].Add(wi);

                }

            }
        }

Примечания:

GetNextord () итерации через поле и возвращает следующее слово и положение Отказ Для реализации его взгляда на использование String.indexof () и методов проверки типа символов Char (ISALPHA ITC).

GetDatabaseTextFieldForid () и GetDatabaseFieldiDs () являются самосназывающимися, реализующими по мере необходимости.

5
ответ дан 5 December 2019 в 20:16
поделиться

Lucene.net Может быть вашим лучшим ставкам. Это зрелый полный текстовый поисковой системой с использованием перевернутых индексов .

http://codeclimber.net.nz/archive/2009/09/02/lucene.net-your-first-application.aspx

Обновление:

Я написал небольшую библиотеку для индексации Коллекции памяти с помощью Lucene.net - это может быть полезно для этого. https://github.com/mcintyre321/linqdex

2
ответ дан 5 December 2019 в 20:16
поделиться

Если вы хотите вращать свои собственные, словарь класс, скорее всего, будет ваша база, как ваша Java Hashtables Отказ Что касается того, что хранится в качестве значений в словаре, его трудно сказать на основе предоставленной вами информации, но обычно алгоритмы поиска используют некоторые тип заданной структуры, чтобы вы могли запускать профсоюзы и пересечения. LINQ дает вам большую часть этой функциональности на любом Ienumerable , хотя специализированный класс набора может повысить производительность.

Одним из таких реализаций набора находится в WINTELLECT PowerCollections . Я не уверен, что это даст вам любую выгоду от производительности или не в течение LINQ.

на данный набор данных , я не уверен, что вы представляете. Я не знаю о том, что «автоматически» пишет на набор данных . Я подозреваю, что вам придется написать это сами, тем более что вы упомянули несколько раз о других сторонах сторонних вариантов, которые не достаточно гибки.

1
ответ дан 5 December 2019 в 20:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: