我有一个类似博客结构的社交功能:帖子和评论。
帖子有一个名为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
}发布于 2013-07-23 08:54:30
这不是一个微不足道的问题。由于机器没有“内容”的概念,因此检索关于某个主题的文章本身就很困难。要猜测每篇文章是否与您的搜索词相关,您必须使用一些代理算法,例如TF-IDF。
我建议使用现有的信息检索库,而不是自己实现。有几个真的很受欢迎。根据我自己的经验,我建议仔细看看Apache Lucene。看看他们的reference list就会发现他们的重要性。
如果你从未接触过信息检索,我保证你会经历一个非常陡峭的学习曲线。要轻松进入整个区域,我建议您首先使用Solr。它几乎是“开箱即用”的,让你对什么是可能的有一个很好的想法。当我开始真正研究可用的过滤器和算法的每一步时,我有了突破。在那之后,我对如何改变才能得到更好的结果有了更好的理解。根据内容的格式,系统可能需要进行认真的调整。
在我的工作中,我花了很多时间使用Lucene,Solr和其他一些工具。我最终得到的结果是可以接受的,但这是一个艰难的过程。它需要大量的理论,测试和原型才能实现。
发布于 2013-07-23 08:50:08
注意:我没有这样做的经验,但这是我解决问题的方法。
首先,我将并行执行您的搜索。通过这样做,它将极大地提高您的搜索功能的性能。
其次,因为您可以输入多个单词,所以我将创建一个评分系统,根据查询对评论进行评分。例如,如果评论有2个查询词,那么它比只包含1个查询词的评论具有更高的分值。或者,如果评论包含完全匹配的内容,那么它可能会得到非常高的分数。
无论如何,在并行循环中根据查询输入对所有评论进行评分后,将排名最靠前的评论作为结果显示给用户。此外,请注意,这是因为数据集大小很小,50-100。
https://stackoverflow.com/questions/17799493
复制相似问题