C# 基于内存的全文搜索

C# 基于内存的全文搜索,c#,search,full-text-search,C#,Search,Full Text Search,我有一个类似于博客的社交功能:帖子和评论 帖子和评论都有一个名为body的字段。帖子和评论存储在SharePoint列表中,因此直接SQL全文查询不可用 如果有人输入“11月停机恢复效率”,我真的不知道如何根据帖子内容及其附加评论正确返回帖子列表 好消息是,我每次需要搜索的帖子不会超过50-100篇。知道了这一点,解决这个问题的最简单方法就是将帖子和评论加载到内存中,并通过循环进行搜索 理想情况下,这样的解决方案是最快的: class Post { public int Id;

我有一个类似于博客的社交功能:帖子和评论

帖子和评论都有一个名为body的字段。帖子和评论存储在SharePoint列表中,因此直接SQL全文查询不可用

如果有人输入“11月停机恢复效率”,我真的不知道如何根据帖子内容及其附加评论正确返回帖子列表

好消息是,我每次需要搜索的帖子不会超过50-100篇。知道了这一点,解决这个问题的最简单方法就是将帖子和评论加载到内存中,并通过循环进行搜索

理想情况下,这样的解决方案是最快的:

class Post
{
    public int Id;
    public string Body;
    public List<Comment> comments;
}
class Comment
{
    public int Id;
    public int ParentCommentId;
    public int PostId;
    public string Body;
}
public List<Post> allPosts;
public List<Comment> allComments;

public List<Post> postsToInclude (string SearchText)
{
    var returnList = new List<Post>();
    foreach(Post post in allPosts)
    {
        //check post.Body with bool isThisAMatch(SearchText, post.Body)
        //if post.Body is a good fit, returnList.add(post);
    }
    foreach(Comment comment in allComments)
    {
        //check post.Body with bool isThisAMatch(SearchText, comment.Body)
        //if comment.Body is a good fit, returnList.add(post where post.Id == comment.PostId);
    }
}

public bool isThisAMatch(string SearchText, string TextToSearch)
{
    //return yes or no if TextToSearch is a good match to SearchText
}
class Post
{
公共int Id;
公共机构;
公开名单评论;
}
课堂评论
{
公共int Id;
公共int-ParentCommentId;
公共int PostId;
公共机构;
}
公开列出所有职位;
公开列出所有评论;
公共列表postsToInclude(字符串搜索文本)
{
var returnList=新列表();
foreach(所有职位中的职位)
{
//使用bool isThisAMatch检查post.Body(搜索文本,post.Body)
//如果post.Body适合,返回list.add(post);
}
foreach(所有注释中的注释)
{
//用bool isThisAMatch检查post.Body(SearchText,comment.Body)
//如果comment.Body适合,则返回list.add(post其中post.Id==comment.PostId);
}
}
public bool isThisAMatch(字符串搜索文本、字符串文本搜索)
{
//如果TextToSearch与SearchText非常匹配,则返回yes或no
}

注意:我没有这样做的经验,但这是我解决问题的方法

首先,我会同时搜索你。通过这样做,它将大大提高搜索功能的性能

其次,因为您可以输入多个单词,所以我将创建一个评分系统,根据查询对评论进行评分。例如,如果注释有2个查询词,则其得分值高于仅包含1个查询词的注释。或者,如果评论中包含完全匹配的内容,则可能会得到很高的分数


无论如何,在并行循环中根据查询输入对所有注释进行评分后,向用户显示最上面的注释作为其结果。另外请注意,这是因为数据集大小很小,50-100。

这不是一个简单的问题。由于机器没有“内容”的概念,检索关于某个主题的文章本身就很困难。要有根据地猜测每篇文章是否与您的搜索词相关,您必须使用一些代理算法,例如

与其自己实现,我建议使用现有的信息检索库。有一些确实很受欢迎。根据我自己的经验,我建议仔细看看。看看它们的重要性

如果你从来没有做过任何与信息检索,我保证一个非常陡峭的学习曲线。为了便于进入整个区域,我建议您先使用。它几乎是“开箱即用”,给你一个很好的想法,什么是可能的。当我开始真正研究可用的过滤器和算法的每个步骤时,我有了一个突破。在那之后,我更好地理解了要改变什么才能获得更好的结果。根据内容的格式,系统可能需要进行严重的调整


我花了很多时间和Lucene、Solr以及我工作中的其他人在一起。我最终得到的结果是可以接受的,但这是一个艰难的过程。这需要大量的理论、测试和原型设计

我可以向你保证,这不是那么容易。你必须考虑到很多不同的方面,所以你最好使用现有的系统。由于政策的原因,添加任何第三方API都是困难的。既然我不需要做任何必要的索引,还有其他方法吗?感谢您的帮助:)TF-IDF似乎是一个从文档中挖掘关键字的过程。我可以从经验告诉你,基于内容的搜索是非常复杂的。你将无法重现别人花了数年时间开发的东西。TF-IDF让您了解搜索词中的单词的相关性。在你的例子中,“In”比“restoration”重要得多。通过比较每个记录(TF)和所有记录(IDF)的频率分析,“非常不重要”被转换为一个数值,用于按相关性排序。