基于记忆的全文检索

时间:2013-07-23 00:13:00

标签: c# search full-text-search

我有一个社交功能,其结构类似于博客:帖子和评论。

帖子有一个名为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
}

2 个答案:

答案 0 :(得分:4)

这不是一个微不足道的主题。由于机器没有“内容”的概念,因此检索关于某个主题的文章本来就很困难。要对每篇文章与您的搜索字词相关进行有根据的猜测,您必须使用一些代理算法,例如: TF-IDF

我建议使用现有的信息检索库,而不是自己实现。有一些非常受欢迎。根据我自己的经验,我建议仔细看看Apache Lucene。看看他们的reference list就表明了他们的意义。

如果您从未与信息检索有任何关系,我保证会有一个非常陡峭的学习曲线。为了便于进入整个区域,我建议您先使用Solr。它几乎可以“开箱即用”,让您对可能性有所了解。当我开始真正了解可用的过滤器和算法的每个步骤时,我有了突破。之后,我更好地了解要改变什么以获得更好的结果。根据您的内容格式,系统可能需要认真调整。

我花了很多时间与Lucene,Solr和我的工作中的一些替代品。我得到的结果到底是可以接受的,但这是一个艰难的过程。它需要大量的理论,测试和原型设计才能实现。

答案 1 :(得分:-1)

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

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

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

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