2010-01-21 90 views
6

我正在编写一个内部应用程序,该应用程序包含多条文本信息以及有关这些文本的若干条数据。这些数据片段将按照输入顺序保存在数据库中(SQL Server,尽管可能会更改)。在C#中为信息检索应用程序编写倒排索引

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

根据我所理解的需要是inverted index,然后根据所保存的附加信息的结果来恢复和修改所述倒排索引的内容(尽管目前这可以在以后作为我只是想倒排索引来索引数据库表/字符串提供的主要文本)。

我在Java中使用Hashtable编写代码时出现了一个错误,使用键作为单词和值作为单词出现的列表的值,但在所有的诚实中,我仍然相当新,在C#和在处理信息时只使用DataSets和DataTables。如果有要求,我会在清除这款笔记本电脑后立即上传Java代码。

如果从表格或字符串列表中获得一组条目,如何在C#中创建倒排索引,最好将其保存到DataSet/DataTable中?

编辑:我忘了提及,我已经尝试过Lucene和Nutch,但是需要我自己的解决方案来修改Lucene来满足我的需要需要比写一个倒排索引要长得多的时间。我将处理大量的元数据,一旦基本倒排索引完成后也需要处理,所以我现在需要的是使用倒排索引在一个区域上进行基本的全文搜索。最后,在倒序索引上工作并不是我每天都要做的事情,所以对它进行破解会很棒。

+0

这是另一种基于泛型的C#倒置索引:http://www.aleandmusic.com/InvertedIndex.aspx – 2011-06-01 22:29:14

回答

4

下面是一个方法的粗略概述我已经在过去成功地使用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); 

       } 

      } 
     } 

注:

GetNextWord()通过现场迭代并返回下一个单词和位置。要实现它,请查看使用string.IndexOf()和char字符类型检查方法(IsAlpha等)。

GetDatabaseTextFieldForID()和GetDatabaseFieldIDS()是自解释的,按需实现。

+0

对不起,回到这个答案的巨大延迟。这看起来很棒!我有这个问题就是如何将你的字典写回数据库。我用我的意思编辑了这个问题。 – 2010-03-20 20:30:13

+0

对不起,我刚刚查看了代码,并意识到我可以复制单词,如果它们出现在多个文档中。将它发送到我的数据库处理类应该很容易;一旦我得到这个实现,我会接受这个答案。 – 2010-03-20 20:34:03

+0

@恩德,很高兴这很有帮助。序列化是从数据库保存/加载的一个选项。或者迭代Dictionary Keys集合并获取每个相应的值将是另一个值。 – Ash 2010-03-21 22:41:55

2

Lucene.net可能是你最好的选择。它是一个成熟的全文搜索引擎,使用inverted indexes

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

UPDATE:

我写索引反对使用Lucene.net在内存中的集合一个小图书馆 - 它可能是这个有用的。 https://github.com/mcintyre321/Linqdex

+0

我应该在我的问题中解释过我已经研究过使用Lucene或用其中的部分功能替换我写了。令人遗憾的是Lucene不够灵活,无法改变我需要的信息来满足我需要的信息标准,所以我需要自己编写倒排索引。 – 2010-01-21 15:20:59

+0

奇怪的是,我对Lucene.net的经验是,它太灵活了,应该是简单的任务。此外,它在中等信任下无法正常工作。加上坚持Java的哲学意味着许多方便和高性能的C#/ .NET成语不被使用。可惜,因为它在很多方面都很棒。 – 2010-09-27 18:05:07

1

如果你正在寻找自己的,Dictionary<T>类很可能会成为你的基地,就像你的Java哈希表。就字典中存储的值而言,根据您提供的信息很难分辨,但通常搜索算法使用某种类型的Set结构,因此您可以运行联合和交叉点。LINQ在任何IEnumerable上为您提供了许多功能,但专门的Set类可能会提升性能。

Set的一个这样的实现在Wintellect PowerCollections中。我不确定这是否会为您带来任何性能优势,而不是通过LINQ。

至于保存到DataSet,我不知道你在想什么。我不知道任何“自动”写入DataSet。我怀疑你必须自己写这个,尤其是因为你多次提到其他第三方选项不够灵活。