在C#中为信息检索应用程序编写反向索引

Mik*_*e B 8 c# search full-text-search data-structures

我正在编写一个内部应用程序,其中包含几条文本信息以及有关这些文本的大量数据.这些数据将按入口顺序保存在数据库(SQL Server,尽管可能会更改)中.

我希望能够搜索这些信息中最相关的信息,其中最相关的信息位于顶部.我最初考虑使用SQL Server全文搜索,但它不像我希望的那样灵活,因为我似乎需要开发自己的解决方案.

根据我的理解,所需要的是倒排索引,然后根据所保存的附加信息的结果恢复和修改所述倒排索引的内容(尽管现在这可以留待以后我想要的日期反向索引从数据库表/字符串提供的索引主文本).

我在使用Hashtable在Java中编写这段代码时遇到了一个问题,其中密钥作为单词,值作为单词出现的列表,但是老实说我仍然是C#的新手并且只是真正使用过处理信息时,如DataSet和DataTables.如果我要求,一旦我清除了这台病毒笔记本,我就会立即上传Java代码.

如果从表或字符串列表中给出一组条目,那么如何在C#中创建一个反向索引,最好保存到DataSet/DataTable中?

编辑:我忘了提到我已经尝试过Lucene和Nutch,但是需要我自己的解决方案,因为修改Lucene以满足我的需求需要比编写倒置索引要长得多.我将处理大量的元数据,这些元数据在基本的反向索引完成后也需要处理,所以我现在需要的是使用反向索引在一个区域上进行基本的全文搜索.最后,制作一个倒排索引并不是我每天都要做的事情,所以对它进行破解是很好的.

Ash*_*Ash 5

以下是我过去在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);

                }

            }
        }
Run Code Online (Sandbox Code Playgroud)

笔记:

GetNextWord()遍历该字段并返回下一个单词和位置.要实现它,请查看使用string.IndexOf()和char字符类型检查方法(IsAlpha等).

GetDatabaseTextFieldForID()和GetDatabaseFieldIDS()是自解释的,根据需要实现.